現状
AppSheetとGASを利用して家事管理アプリを作成しています。
AppSheetでは1つのテーブル(≒スプレッドシート)につき1つしかカレンダー表示ができないため、GASを使って2つのスプレッドシート(家事ログ&買い物ログ)をひとつのGoogleカレンダーに集約し、そのカレンダーをAppSheetのアプリ上に表示する方法をとっています。
問題
自動でスプレッドシートに追加された行をGoogleカレンダーに反映させるところまでは上手くいったのですが、既に追加された予定についてスプレッドシートに変更を加えても当然ですがGoogleカレンダーには反映されません。
質問
スプレッドシート上で日時を変更した際にGoogleカレンダーの予定も変更できるようにしたいのですが、何か良い方法はありますでしょうか?
以下、該当箇所のGASのコードとスプレッドシートです。
家事ログスプレッドシート
| 家事ログID | 家事ID | 家事名 | 日時 | カレンダーID |
|---|---|---|---|---|
| ***** | ****** | 洗濯 | 2022/03/19 16:00 | ***@gmail.com |
買い物ログスプレッドシート
| 買い物ログID | 商品ID | 商品名 | 購入日 | カレンダーID |
|---|---|---|---|---|
| ***** | ****** | 醤油 | 2022/03/19 00:00 | ***@gmail.com |
GASコード
Javascript
1function registerCalendar1() { 2 var calendar = CalendarApp.getCalendarById(`**********@group.calendar.google.com`); 3 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 4 var sheet = spreadsheet.getSheetByName(`買い物ログ`); 5 var lastRow = sheet.getLastRow(); 6 var contents = sheet.getRange(`C2:E${lastRow}`).getValues() 7 8 for(var i=0; i < contents.length; i++){ 9 var[title, day, status] = contents[i]; 10 if(status == ""){ 11 var date = new Date(day) 12 var category = "買い物"; 13 var event = calendar.createAllDayEvent(title,date,{description:category}); 14 var eventId = event.getId(); 15 sheet.getRange(`E${i + 2}`).setValue(eventId); 16 } 17 } 18} 19 20function registerCalendar2() { 21 var calender = CalendarApp.getCalendarById(`**********@group.calendar.google.com`); 22 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 23 var sheet = spreadsheet.getSheetByName(`家事ログ`); 24 var lastRow = sheet.getLastRow(); 25 var contents = sheet.getRange(`C2:E${lastRow}`).getValues() 26 27 for(var i=0; i < contents.length; i++){ 28 var[title, daytime, id] = contents[i]; 29 if(id == ""){ 30 var datetime = new Date(daytime) 31 var category = "家事"; 32 var event = calender.createEvent(title,datetime,datetime,{description:category}); 33 var eventId = event.getId(); 34 sheet.getRange(`E${i + 2}`).setValue(eventId); 35 } 36 } 37}
訂正です。
2つのスプレッドシートの「カレンダーID」は「イベントID」の誤りです。
追記です。
descriptionに「買い物」「家事」等のカテゴリーを挿入することで、AppSheet上でイベントの種類ごとに色分けできるようにしています。また、「買い物ログID」「商品ID」「家事ログID」「家事ID」はAppSheetのRaf機能を使う上で必要なものであり、スプレッドシートとGoogleカレンダーの連携には用いないであろうと踏んでいます。
以下のようなコードを試してみましたが、getEventByIdが定義されていない(?)とかでエラーが出ました。
function registerCalendar1() {
var calendar = CalendarApp.getCalendarById(`c6uqve02j7s6np2u71380ho71k@group.calendar.google.com`);
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getSheetByName(`買い物ログ`);
var lastRow = sheet.getLastRow();
var contents = sheet.getRange(`C2:E${lastRow}`).getValues()
for(var i=0; i < contents.length; i++){
var[title, day, id] = contents[i];
if(id == ""){
var date = new Date(day)
var category = "買い物";
var event = calendar.createAllDayEvent(title,date,{description:category});
var eventId = event.getId();
sheet.getRange(`E${i + 2}`).setValue(eventId);}
else{
var event = getEventById(id)
var date = new Date(day)
event.setAllDayDate(date)
}
}
}
回答2件
あなたの回答
tips
プレビュー