ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

GAS - Googleカレンダーの予定をスプレッドシートに書き込む

初めに

 本記事では、GASを使ってスプレッドシートGoogle カレンダーの予定を書き込む方法をまとめます。

全体の流れ

目標

 GAS(Google Apps Script)を実行すると、スプレッドシートGoogle カレンダーの予定を書き込まれるようにすることを目標にします。

手順

 次の手順で作成します。

  1. スプレッドシートの作成
  2. Google Apps Script の作成
  3. GoogleカレンダーIDを確認
  4. GoogleカレンダーIDと予定取得開始日、取得終了日を記述するシートの作成
  5. コードの記述
  6. 実行

スプレッドシートの作成

 まずは、Google Drive 内でスプレッドシートを作成します。右クリックし、スプレッドシートをクリックすると作成できます。


Google Apps Script を作成

 スプレッドシート拡張機能から Apps Script をクリックし、Google Apps Script を作成します。

 Google Apps Script の編集画面が開きます。


GoogleカレンダーIDの確認

 Googleカレンダーの予定を取得するために、GoogleカレンダーIDが必要なので確認します。

 Google カレンダーを開き、設定(Setting)をクリックします。

 IDを確認したいカレンダーを選択し、メニューの中から「設定と共有」を選択します。

 カレンダーの設定が表示されるので、下部の方にあるカレンダーIDを確認しましょう。


GoogleカレンダーIDと予定取得開始日、取得終了日を記述するシートの作成

 設定用の "Setting" シートを作成します。

 上の画像のようにGoogleカレンダーIDと予定取得開始日、取得終了日を記述します。

コードの記述

コード全文

 Google Apps Script のコードを次のように記述していきます。

(コード全文)

function exportCalendarEventsToSheet() {
  // スプレッドシートのID
  var spreadsheetId = SpreadsheetApp.getActiveSpreadsheet().getId();

  // スプレッドシート内のシート名
  var inputSheetName = 'InputSheet';
  var settingSheetName = "Setting"

  // B2セル(calendarID), B4セル(開始日), B5セル(終了日)の値を取得
  var sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(settingSheetName);
  var calendarId = sheet.getRange('B2').getValue();
  // B5セル、B6セルの値を取得
  var startDateString = sheet.getRange('B4').getValue();
  var endDateString = sheet.getRange('B5').getValue();

  // B5セルの値をDateに変換
  var startDate = new Date(startDateString);
  // B6セルの値をDateに変換
  var endDate = new Date(endDateString);

  // ログの確認
  Logger.log(calendarId)

  // CalendarAppクラスをインポート
  var Calendar = CalendarApp;

  // カレンダーのイベントを取得
  var events = Calendar.getEvents(startDate, endDate)

  // スプレッドシートを開く
  var sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(inputSheetName);

  // ヘッダーを書き込む
  sheet.getRange(1, 1, 1, 4).setValues([['イベント名', '開始日時', '終了日時', '場所']]);

// イベントをスプレッドシートに書き込む
  for (var i = 0; i < events.length; i++) {
    var event = events[i];
    var startDateTime = event.isAllDayEvent() ? event.getAllDayStartDate() : event.getStartTime();
    var endDateTime = event.isAllDayEvent() ? event.getAllDayEndDate() : event.getEndTime();
    var rowData = [event.getTitle(), startDateTime, endDateTime, event.getLocation()];
    sheet.appendRow(rowData);
  }
}

解説

(シート名の記述)
 シート名は繰り返し使用する可能性があるため、初めに記述しておきます。予定を書きだしたいシート名を inputSheetName に代入しておきます。

  // スプレッドシート内のシート名
  var inputSheetName = 'InputSheet';
  var settingSheetName = "Setting"

("Setting" シートからID、開始日、終了日を取得)

  // B2セル(calendarID), B4セル(開始日), B5セル(終了日)の値を取得
  var sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(settingSheetName);
  var calendarId = sheet.getRange('B2').getValue();
  // B5セル、B6セルの値を取得
  var startDateString = sheet.getRange('B4').getValue();
  var endDateString = sheet.getRange('B5').getValue();

  // B5セルの値をDateに変換
  var startDate = new Date(startDateString);
  // B6セルの値をDateに変換
  var endDate = new Date(endDateString);

  // ログの確認
  Logger.log(calendarId)

 上記のコードで使われている関数は次の通りです。

  • SpreadsheetApp.openById() を使って、スプレッドシートを指定
  • getSheetByName() を使って、シート名からシートを指定
  • sheet.getRange('B2').getValue() のようにgetRange() でセルの指定、getValue() で値を取得
  • 日付を string で取得しているため、Date 型に変換
  • Logger.log() を使って、カレンダーIDをログに表示

(カレンダーのイベントを取得)

  // CalendarAppクラスをインポート
  var Calendar = CalendarApp;

  // カレンダーのイベントを取得
  var events = Calendar.getEvents(startDate, endDate)

 Calendar App クラスは、ユーザーの Google カレンダーの読み取りと更新をスクリプトに許可します。

developers.google.com

 今回は、getEvents() 関数を使って、イベントを取得しています。引数は開始日と終了日です。

スプレッドシートに書き込み)

  // スプレッドシートを開く
  var sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(inputSheetName);

  // ヘッダーを書き込む
  sheet.getRange(1, 1, 1, 4).setValues([['イベント名', '開始日時', '終了日時', '場所']]);

// イベントをスプレッドシートに書き込む
  for (var i = 0; i < events.length; i++) {
    var event = events[i];
    var startDateTime = event.isAllDayEvent() ? event.getAllDayStartDate() : event.getStartTime();
    var endDateTime = event.isAllDayEvent() ? event.getAllDayEndDate() : event.getEndTime();
    var rowData = [event.getTitle(), startDateTime, endDateTime, event.getLocation()];
    sheet.appendRow(rowData);
  }

 書き込み用のシートを開き、ヘッダーを書き込んだ後、取得したイベントを for 文で書き込みます。

 isAllDayEvent() は終日のイベントかどうかを判定します。終日のイベントの場合 True、そうではない場合 False を返します。

 終日のイベントか否かで、getAllDayStartDate() と getStartTime() を使い分ける必要があるため、このようにラムダ式を使っています。

 rowData にタイトル、開始時間、終了時間、場所のリストを代入しています。

 最後に、sheet.appendRow() 関数を使って、rowData を最終行に挿入しています。

 appendRow() 関数は、既存データが格納されている最終行の次の行に値を挿入する関数です。

実行

 実行ボタンをクリックし、実行していきます。

 いろいろと承認が必要になります。承認しなければ、上の画像のようにログに警告が表示されます。

 下の画像のように、赤線を引いている部分をクリックしていくと承認できます。

 正常に実行されると、次のように予定が出力されます。

 もし、エラーが出た場合は、ログにエラーコードが表示されるので、それをもとに修正しましょう。