スプレッドシートからカレンダーに予定を登録する Googleカレンダーアプリ①

スプレッドシートからワンクリックでカレンダーに予定を登録できたら便利だと思いませんか?

まずカレンダーアプリを開いて、予定のある日にちに移動して、タイトルを入力して、日時を選択して…と、ちまちま作業が多いのがカレンダー登録ですね。
これに、場所とか、説明とかも追加して、さらにメンバー全員にメールで知らせるとなると、かなりの作業量になることも。

こんなカレンダー登録の悩みをGASで一気に解決しちゃいましょう!

スプレッドシートで予定を管理する

はじめに、予定を管理するスプレッドシートを用意します。

「サンプル_イベント_名簿」では以下の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 ループが実行されるとき、次の処理が行われます :

  1. もしあれば、初期化式が実行されます。この式は通常、1 個またはそれ以上のループカウンターを初期化しますが、この構文ではいかなるレベルの複雑な式を入れることが可能です。初期化式で変数を宣言することもできます。
  2. 条件式が評価されます。条件式の値が true の場合、ループ文が実行されます。条件式の値が false の場合、for ループは終了します。条件式がすべて省略されている場合、条件式は真であると仮定されます。
  3. が実行されます。複数の文を実行するには、それらの文をグループ化するためにブロック文 ({ ... }) を使用します。
  4. もしあれば、加算式が実行されます。
  5. ステップ 2 に制御が戻ります。
MDNリファレンスより引用

条件式の 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行が取得され、各行には各列が要素として取得されていることがわかります。
そして、各列の要素は、分割代入で宣言した変数に、一度にまとめて格納されます。

POINT

分割代入

複数の変数に配列の要素をまとめて代入したいときには、分割代入が便利です。

[ 変数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は必須引数です。

引数プロパティ説明
titleString必須イベントのタイトル
startTimeDate必須イベントの開始日時
endTimeDate必須イベントの終了日時
optionsObjectオプション{ 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実行」メニューが表示されたら、カレンダー登録がちゃんとできるかどうか、テストしてみましょう!
テスト前に、チェック欄の「済」を一旦削除することをお忘れなく!

シリーズ目次:Googleカレンダーアプリ①〜④

  1. スプレッドシートからGoogleカレンダーに予定を登録する Googleカレンダーアプリ①
  2. イベントの招待メールを一括送信する Googleカレンダーアプリ②
  3. 定期イベントをカレンダーに登録する Googleカレンダーアプリ③
  4. イベントのゲストにリマインドメールを自動送信する Googleカレンダーアプリ④

GASGカレンダー

Posted by botw