質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
AppSheet

AppSheetは、ノーコードでアプリ開発ができるプラットフォーム。プログラミングの知識がなくても、マウス操作だけで簡単にアプリを開発できます。サードパーティサービスに標準で接続できる他、サンプルアプリケーションも豊富。料金がリーズナブルな点も特徴です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

2回答

1687閲覧

スプレッドシートの変更をGoogleカレンダーに反映させたい

cahier0401

総合スコア14

AppSheet

AppSheetは、ノーコードでアプリ開発ができるプラットフォーム。プログラミングの知識がなくても、マウス操作だけで簡単にアプリを開発できます。サードパーティサービスに標準で接続できる他、サンプルアプリケーションも豊富。料金がリーズナブルな点も特徴です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

1グッド

2クリップ

投稿2022/03/27 11:24

現状

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}
penguin520👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cahier0401

2022/03/27 11:33

訂正です。 2つのスプレッドシートの「カレンダーID」は「イベントID」の誤りです。 追記です。 descriptionに「買い物」「家事」等のカテゴリーを挿入することで、AppSheet上でイベントの種類ごとに色分けできるようにしています。また、「買い物ログID」「商品ID」「家事ログID」「家事ID」はAppSheetのRaf機能を使う上で必要なものであり、スプレッドシートとGoogleカレンダーの連携には用いないであろうと踏んでいます。
cahier0401

2022/03/27 14:12

以下のようなコードを試してみましたが、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) } } }
guest

回答2

0

自己解決

コードを分けることでイベントが2件作成される問題も解決しました。

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, id] = contents[i]; 10 if(id == ""){ 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 changeCalendar1() { 21 var calendar = 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, day, id] = contents[i]; 29 if(id != ""){ 30 var event = calendar.getEventById(id); 31 var date = new Date(day); 32 event.setAllDayDate(date); 33 } 34 } 35} 36 37function registerCalendar2() { 38 var calendar = CalendarApp.getCalendarById(`********@group.calendar.google.com`); 39 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 40 var sheet = spreadsheet.getSheetByName(`家事ログ`); 41 var lastRow = sheet.getLastRow(); 42 var contents = sheet.getRange(`C2:E${lastRow}`).getValues() 43 44 for(var i=0; i < contents.length; i++){ 45 var[title, daytime, id] = contents[i]; 46 if(id == ""){ 47 var datetime = new Date(daytime) 48 var category = "家事"; 49 var event = calendar.createEvent(title,datetime,datetime,{description:category}); 50 var eventId = event.getId(); 51 sheet.getRange(`E${i + 2}`).setValue(eventId); 52 } 53 54 } 55} 56 57function changeCalendar2() { 58 var calendar = CalendarApp.getCalendarById(`********@group.calendar.google.com`); 59 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 60 var sheet = spreadsheet.getSheetByName(`家事ログ`); 61 var lastRow = sheet.getLastRow(); 62 var contents = sheet.getRange(`C2:E${lastRow}`).getValues() 63 64 for(var i=0; i < contents.length; i++){ 65 var[title, daytime, id] = contents[i]; 66 if(id != ""){ 67 var event = calendar.getEventById(id); 68 var datetime = new Date(daytime); 69 event.setTime(datetime,datetime); 70 } 71 } 72}

投稿2022/03/28 08:58

cahier0401

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

お騒がせしました。
イベントIDが既にセットされていた場合、日時を新たに取得してイベントに挿入することで解決いたしました。

今度はカレンダーに同じ予定が2つ作成される問題が発生してしまいました……
解決策はありますでしょうか?

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, id] = contents[i]; 10 if(id == ""){ 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 else{ 17 var event = calendar.getEventById(id); 18 var date = new Date(day); 19 event.setAllDayDate(date); 20   } 21 } 22} 23 24function registerCalendar2() { 25 var calendar = CalendarApp.getCalendarById(`********@group.calendar.google.com`); 26 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 27 var sheet = spreadsheet.getSheetByName(`家事ログ`); 28 var lastRow = sheet.getLastRow(); 29 var contents = sheet.getRange(`C2:E${lastRow}`).getValues() 30 31 for(var i=0; i < contents.length; i++){ 32 var[title, daytime, id] = contents[i]; 33 if(id == ""){ 34 var datetime = new Date(daytime) 35 var category = "家事"; 36 var event = calendar.createEvent(title,datetime,datetime,{description:category}); 37 var eventId = event.getId(); 38 sheet.getRange(`E${i + 2}`).setValue(eventId);} 39 else{ 40 var event = calendar.getEventById(id); 41 var datetime = new Date(daytime); 42 event.setTime(datetime,datetime); 43 } 44 } 45}

投稿2022/03/27 14:40

編集2022/03/28 08:55
cahier0401

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問