今回は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
に変えています。
編集前

編集後

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

処理実行後

第四区間部分の日付に修正がかかっていることがわかります。
こちらも案件が増えてきたらインストーラブルトリガーで時間指定して作動するようにしてみましょう。
まとめ
読んだらすごい単純なことをしているコードも書く時は時間がどんどん溶ける。
(コピペしてるだけのはずなのにあら不思議!もう日付超えちゃってる*∞)
どなたかの時短になれば幸いです。
参考リンク一覧
Google Apps Scriptリファレンス
英語なので「DeepL」と「Google翻訳」で翻訳しながら格闘しました。
【GAS】getAllDayStartDateメソッドを完全マスター
【GAS】getEventsメソッドを完全マスター
Google Apps ScriptでGoogleカレンダーのイベントタイトルを変更する方法