Google Apps Script

Google Apps ScriptでGoogleカレンダー連携したイベントの日付を変更する

カレンダー連携したイベントの日付を変更する

 

今回はGoogle Apps Scriptを使って1案件複数区間の日付をカレンダーに連携するでGoogleカレンダーに連携したイベントの日付が変更された場合、スプレッドシートの該当区間を編集するだけでカレンダーの日付も変更されるスクリプトを組んでいきます。

一番簡単な方法で「スプレッドシートに記載のIDとGoogleカレンダーのIDを照合して、開始日または終了日が該当セルと一致しなければ書き換え」としています。

 

今回ハマった点
  • 英語が読めなさすぎて .setAllDayDates メソッドを発見するまで2日位かかった。
  • ID取得を考える前はイベントの開始日と終了日を直接取得できないか考えてた。(無理だった)
  • Googleカレンダー上の全期間イベント取得方法に迷った。(結局過去のイベントの日付は変えないので今日〜90日後に設定)

 

 

全体のスクリプト文

 

ソースコード

for文で4区間分に分けている点とスプレッドシートの情報は分割代入している点ではGoogle Apps Scriptを使って1案件複数区間の日付をカレンダーに連携すると記述方法はかなり似ています。
(上手い書き方が分からないだけ)

function redoCalendar(){
  var calendar = CalendarApp.getCalendarById("カレンダーID(メールアドレス)を入力");
  var sheet = SpreadsheetApp.getActiveSheet();
  var lastRow = sheet.getLastRow();
  var contents = sheet.getRange(`A2:AG${lastRow}`).getValues();
//Dateオブジェクトで本日の日付を取得
  var Start = new Date();
//90日後の日付を秒に変更して取得
  var End = new Date(Date.parse(Start) + (90 * 60 * 60 * 24 * 1000));
//今日〜90日後のカレンダーイベントを全て取得
  var events = calendar.getEvents(Start,End);
//カレンダーのイベントを1件ずつ取得
  for(const event of events){
//カレンダーからのイベントタイトル、開始日、終了日、ID取得 
    var eventTitle = event.getTitle();
    var eventStartDate = event.getAllDayStartDate();
    var eventEndDate = event.getAllDayEndDate();
//googleカレンダー表示の時に+1をした分を引く
    eventEndDate.setDate(eventEndDate.getDate() - 1);
    var eventID = event.getId();
//スプレッドシートから情報を取ってくる
    for(var i = 0 ; i < contents.length ; i++ ){
      var [id, mailDay, agency, storeName, landPage, adCost, firstStatus, firstStart, firstEnd, firstBanner, firstDesign, secondStatus,secondStart, secondEnd, secondBanner, secondDesign, thirdStatus,thirdStart, thirdEnd, thirdBanner, thirdDesign, fourthStatus,fourthStart, fourthEnd, fourthBanner, fourthDesign, report, note, space, firstID, secondID, thirdID, fourthID] = contents[i];
//カレンダーのイベントIDがスプレッドシート第一区間のIDと一致した場合
      if(eventID == firstID){  
//ID一致した状態で開始日または終了日が異なる場合は
        if(eventStartDate != firstStart || eventEndDate != firstEnd){
//イベントを書き換える
          firstEnd.setDate(firstEnd.getDate() + 1);
          event.setAllDayDates(firstStart, firstEnd);
        }
      }else if(eventID == secondID){  
        if(eventStartDate != secondStart || eventEndDate != secondEnd){
          //イベントを書き換える
          secondEnd.setDate(secondEnd.getDate() + 1);
          event.setAllDayDates(secondStart, secondEnd);
        }
      }else if(eventID == thirdID){  
        if(eventStartDate != thirdStart || eventEndDate != thirdEnd){
          //イベントを書き換える
          thirdEnd.setDate(thirdEnd.getDate() + 1);
          event.setAllDayDates(thirdStart, thirdEnd);
        }
      }else if(eventID == fourthID){
        if(eventStartDate != fourthStart || eventEndDate != fourthEnd){
          //イベントを書き換える
          fourthEnd.setDate(fourthEnd.getDate() + 1);
          event.setAllDayDates(fourthStart, fourthEnd);
        }
      }
    }
  }
}

 

スクリプト文に関しての説明はコメントの通りです。

 

スプレッドシート

今回スプレッドシートは第四区間の日付を

2020/11/15-2020/11/20から2020/11/16-2020/11/19

に変えています。

編集前

GASカレンダー登録処理後

編集後

Googleカレンダー日付変更処理

余談ではありますが、今回カレンダーからのイベント取得で指定したのは .getAllDayStartDate()なので、時間指定された単日イベントが存在すると「
Exception: このカレンダーの予定は終日イベントではありません。」とエラーが出ます。

 

Googleカレンダー

 

処理実行前

GASカレンダー連携

処理実行後

Googleカレンダー連携修正後

第四区間部分の日付に修正がかかっていることがわかります。

こちらも案件が増えてきたらインストーラブルトリガーで時間指定して作動するようにしてみましょう。

 

まとめ

 

読んだらすごい単純なことをしているコードも書く時は時間がどんどん溶ける。
(コピペしてるだけのはずなのにあら不思議!もう日付超えちゃってる*∞)

どなたかの時短になれば幸いです。

参考リンク一覧

Google Apps Scriptリファレンス
英語なので「DeepL」と「Google翻訳」で翻訳しながら格闘しました。

【GAS】getAllDayStartDateメソッドを完全マスター
【GAS】getEventsメソッドを完全マスター

Google Apps ScriptでGoogleカレンダーのイベントタイトルを変更する方法