スプレッドシートからカレンダーに予定を登録する Googleカレンダーアプリ①
スプレッドシートからワンクリックでカレンダーに予定を登録できたら便利だと思いませんか?
まずカレンダーアプリを開いて、予定のある日にちに移動して、タイトルを入力して、日時を選択して…と、ちまちま作業が多いのがカレンダー登録ですね。
これに、場所とか、説明とかも追加して、さらにメンバー全員にメールで知らせるとなると、かなりの作業量になることも。
こんなカレンダー登録の悩みをGASで一気に解決しちゃいましょう!
- 1. スプレッドシートで予定を管理する
- 2. 完成コード
- 3. テスト実行
- 4. コード解説
- 4.1. CalendarApp.getDefaultCalendar( )
- 4.2. for (let i = 0; i < values.length; i++) { 処理 }
- 4.3. const [check, title, day, startTime, endTime, location, description] = values[i]
- 4.4. 分割代入
- 4.5. for…if…continue
- 4.6. const startDate = new Date(day)
- 4.7. calendar.createEvent( title, startDate, endDate, options )
- 4.8. sheet.getRange(startRow + i, 1).setValue(“済")
- 5. メニューから関数を実行
- 6. シリーズ目次:Googleカレンダーアプリ①〜④
スプレッドシートで予定を管理する
はじめに、予定を管理するスプレッドシートを用意します。
「サンプル_イベント_名簿」では以下の7項目としました。
・チェック欄
・タイトル
・日付
・開始時刻
・終了時刻
・場所
・説明
この「イベント」シートに必要項目を適時入力して、予定を管理します。

スプレッドシートの「拡張機能」から「Apps Script」を開いて下の完成コードをコピペします。
デフォルトのfunction myFunctionは削除します。

完成コード
// スプレッドシートからカレンダーに予定を登録する
function createEventFromSheet() {
const calendar = CalendarApp.getDefaultCalendar(); // カレンダーの選択
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('イベント'); // シートの選択
const startRow = 2; // データの開始行を変数に格納
const numRows = sheet.getLastRow() - 1; // 取得するデータの行数を変数に格納
const values = sheet.getRange(startRow, 1, numRows, 7).getValues(); // データを取得してvaluesに格納
for (let i = 0; i < values.length; i++) { // for文で各行をループ処理
const [check, title, day, startTime, endTime, location, description] = values[i]; // 分割代入で各列を変数に格納
if (check == "済") { // 登録済みの予定はスキップ
continue;
}
const startDate = new Date(day); // 開始時刻の成形
startDate.setHours(startTime.getHours()); // 開始時刻(時)
startDate.setMinutes(startTime.getMinutes()); // 開始時刻(分)
const endDate = new Date(day); // 終了時刻の成形
endDate.setHours(endTime.getHours()); // 終了時刻(時)
endDate.setMinutes(endTime.getMinutes()); // 終了時刻(分)
const options = {location: location, description: description}; // オプションの成形
calendar.createEvent(title, startDate, endDate, options); // createEventメソッドに定義した引数を渡して実行
sheet.getRange(startRow + i, 1).setValue("済"); // 予定を登録したらチェック欄を「済」にする
}
}
テスト実行
さっそく、createEventFromSheet関数を実行して、結果を見てみましょう。
最初の実行には権限の承認が求められます。
Googleカレンダーを開いてみると、スプレッドシートの3つのイベントが一度に登録されています。
タイトル、開始日時も間違いありません。

終了時刻、場所、説明はどうでしょうか?
3月16日の「面接」をクリックしてみます。
ご覧のとおり、スプレッドシートのデータがちゃんと反映しています。
これなら、登録する予定が何件あっても楽ちんですね!

スプレッドシートのチェック欄には、「済」と入力されました。

コード解説
CalendarApp.getDefaultCalendar( )
その名の通り、ユーザーのデフォルトのカレンダーを取得するメソッドです。
CalendarAppクラス公式リファレンス
for (let i = 0; i < values.length; i++) { 処理 }
JavaScriptでループ処理を行う時の定番コードである for 文 です。
for
文は以下のような形です :for ([初期化式]; [条件式]; [加算式]) 文
for
ループが実行されるとき、次の処理が行われます :MDNリファレンスより引用
- もしあれば、
初期化式
が実行されます。この式は通常、1 個またはそれ以上のループカウンターを初期化しますが、この構文ではいかなるレベルの複雑な式を入れることが可能です。初期化式で変数を宣言することもできます。条件式
が評価されます。条件式
の値がtrue
の場合、ループ文が実行されます。条件式
の値がfalse
の場合、for
ループは終了します。条件式
がすべて省略されている場合、条件式は真であると仮定されます。文
が実行されます。複数の文を実行するには、それらの文をグループ化するためにブロック文 ({ ... }
) を使用します。- もしあれば、
加算式
が実行されます。- ステップ 2 に制御が戻ります。
条件式の i < values.length が true の間、繰り返し処理が行われます。
values.length はvaluesの要素数を取得するプロパティですので、今回は3となります。
したがって、iが3未満までループすることになり、0,1,2と3回繰り返して処理を終了します。
const [check, title, day, startTime, endTime, location, description] = values[i]
values[i] の中身を見てみましょう。
i には0,1,2が順番に入ることによって、1行づつ合計3行が取得され、各行には各列が要素として取得されていることがわかります。
そして、各列の要素は、分割代入で宣言した変数に、一度にまとめて格納されます。

分割代入
複数の変数に配列の要素をまとめて代入したいときには、分割代入が便利です。
[ 変数1, 変数2, … ] = 配列
とすれば、変数1に配列のインデックス0の要素、変数2にインデックス1の要素、…とまとめて代入を行えます。

for…if…continue
continue文は、for文のループ処理において、条件がtrueだった場合にその残りの処理をスキップして、次の処理を開始します。
const startDate = new Date(day)
Dateオブジェクトについてはたくさんの情報があります。ググってみてください。
公式リファレンスはこちら
calendar.createEvent( title, startDate, endDate, options )
createEvent( )は、カレンダーに新しいイベントを作成するメソッドです。
title、startTime、endTimeは必須引数です。
引数 | 型 | プロパティ | 説明 | |
---|---|---|---|---|
title | String | 必須 | イベントのタイトル | |
startTime | Date | 必須 | イベントの開始日時 | |
endTime | Date | 必須 | イベントの終了日時 | |
options | Object | オプション | { description, location, guests, sendInvites } | イベントの説明 (String) イベントの場所 (String) ゲストのメールアドレス (String) 招待メールを送信するかどうか (Boolean) |
シリーズ②では、オプションのguestsとsendInvitesを使って自動で招待メールを送ってみたいと思います。
sheet.getRange(startRow + i, 1).setValue(“済")
getRange( )については、こちらの記事で解説しています。
startRow = 2ですので、( 2 + 0 = 2, 1)、( 2 + 1 = 3, 1)、( 2 + 2 = 4, 1)のセルに順に「済」と入力されます。
セルの値を取得するときは、getValue( )メソッド、
反対に、セルに値を入力するときは、setValue( )メソッドです。
メニューから関数を実行
せっかく便利な関数を作っても、それをいちいちApps Scriptを開いて実行するのは不便ですね。
そこで、スプレッドシートに関数を実行できるカスタムメニューを追加しましょう。
完成形は下図のような感じです。
メニューの「ヘルプ」の右に「GAS実行」という新たなカスタムメニューが追加されています。
「GAS実行」をクリックすると、サブメニューの「カレンダーに登録」が表示され、それをクリックするとcreateEventFromSheet関数が実行し、カレンダー登録がワンクリックで完了します。

カスタムメニューの裏で動いているコードはこちらです。
Apps Scriptにコピペして保存。
スプレッドシートをリロードすれば、カスタムメニューが表示されます。
コードの解説はここでは省略します。
function onOpen() {
const ui = SpreadsheetApp.getUi();
const menu = ui.createMenu('GAS実行');
menu.addItem('カレンダーに登録', 'createEventFromSheet');
menu.addToUi();
}
無事、「GAS実行」メニューが表示されたら、カレンダー登録がちゃんとできるかどうか、テストしてみましょう!
テスト前に、チェック欄の「済」を一旦削除することをお忘れなく!