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

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

新規登録して質問してみよう
ただいま回答率
85.31%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google カレンダー

Google カレンダーは、Google社が提供する無料のスケジュール管理ツールです。パソコンやスマートフォン、タブレットなどからアクセスし、スケジュールの追加・変更が可能。Googleアカウントがあれば誰でも使用できます。

Google Apps Script

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

Q&A

解決済

1回答

283閲覧

GASで未取得のカレンダーイベントを取得する方法

mijinko.1204

総合スコア3

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google カレンダー

Google カレンダーは、Google社が提供する無料のスケジュール管理ツールです。パソコンやスマートフォン、タブレットなどからアクセスし、スケジュールの追加・変更が可能。Googleアカウントがあれば誰でも使用できます。

Google Apps Script

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

0グッド

0クリップ

投稿2023/06/30 01:34

実現したいこと

GASで特定のカレンダーイベントを取得したいが、一度取得されたイベントは取得せず、新しいイベントのみ最終行へ記載するようにしたい。

前提

GASで「free」という題名のイベントのみ取得して、スプレッドシートへ追加していくようにコードを構築している。
今日から+30日間のイベントを自動的に読み込んでスプレッドシートに記入していきたいが、一度読み込んだイベントは再記入せず、読み込まれていない新しいイベントのみ追記していくようにしたい。

該当のソースコード

const ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("テスト"); const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("リスト"); function myFunction() { const sheetID = sheet.getRange("C3").getValue(); const listID = sheetID.split(","); for(let i = 0; i < listID.length; i++){ const calenger = CalendarApp.getOwnedCalendarById(listID[i]); const now = new Date(); const events = calenger.getEvents(now, new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000)); // 30日後までのイベントを取得 for (const event of events) { if (event.getTitle() === "free") { ss.appendRow([ listID[i], event.getStartTime(), ]); } } }

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

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

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

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

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

YellowGreen

2023/06/30 06:23

新規に追加されたものは、最終行に追記するとして、 一度記入済みの予定で開始時刻や終了時刻、会場などが変更された予定は記入済みの内容を変更するのでしょうか? それとも、記入済みの行を削除して新たに変更後の予定を最終行に追記するのでしょうか?
mijinko.1204

2023/06/30 06:28

一度記入された予定で内容が変更された場合は、カレンダーに内容が反映され、今日から2週間前までのイベントが自動的に消されていくようにしたいと思ってます。 シートの内容としては、freeの時間をスプレッドシートで管理し、そこに例えば会議と詳細を書けばカレンダーのイベント題名がfreeから会議に変更され、メモ欄に書いた詳細を反映されるようにしたいです。
YellowGreen

2023/06/30 06:45

カレンダーに新規の予定が記入された時にスプレッドシートに記入する方法に関する質問だと理解していました。 なので、新規の予定の記入ではなく、カレンダーの予定が変更されたときのスプレッドシートへの反映をどのようにしたいのかをお尋ねしたのです。 今回のお答えだと一度記録した予定はカレンダーでは変更されることはないと理解してよろしいでしょうか。 なお、シートからカレンダーへの反映については改めて質問をアップされるものと受け止めております。
guest

回答1

0

ベストアンサー

一応念のため、記録済みの予定をカレンダーで更新した場合は、既存の記録を削除して新たに追加された予定に加え更新のあった予定も最終行に追記していくスクリプトの例としました。
記録済みの予定がカレンダーからは更新されなければ、新規に追加された予定のみが追記されるます。
なお、記録済みの予定かどうかの確認のためにイベントIDと更新日を記録します。
見出し行が1行目にある前提で列見出しは、A列から
イベントID、更新日、カレンダー名、開始日、開始時刻、終了日、終了時刻
となります。

JavaScript

1//イベントIDと更新日を記録しておき新たな予定のみを追記するバージョン 2function myFunction() { 3 const numTitleRows = 1;//見出しの行数 4 const ss = SpreadsheetApp.getActiveSpreadsheet(); 5 const sheetTest = ss.getSheetByName('テスト'); 6 const sheetList = ss.getSheetByName('リスト'); 7 const calendarIds = sheetList.getRange('C3') 8 .getValue() 9 .split(','); 10 const records = sheetTest.getDataRange().getValues(); 11 records.splice(0, numTitleRows); 12 const values = []; 13 for (const calendarId of calendarIds) { 14 const calendar = CalendarApp.getCalendarById(calendarId); 15 if (!calendar) { 16 console.log(`IDが${calendarId}のカレンダーが見つかりませんでした。`); 17 continue; 18 } 19 const startTime = new Date(); 20 const endTime = new Date(startTime.getTime() + 1000 * 60 * 60 * 24 * 30); 21 const events = calendar.getEvents(startTime, endTime); 22 for (const event of events) { 23 if (event.getTitle() == 'free') { 24 const eventId = event.getId(); 25 const lastUpdated = event.getLastUpdated(); 26 const index = records.findIndex(v => v[0] == eventId); 27 if (index > -1) { 28 if (records[index][1].getTime() == lastUpdated.getTime()) { 29 continue;//イベントIDと更新日が同じなら除外 30 } else { 31 //更新された予定の記録は一旦削除 32 sheetTest.deleteRow(index + numTitleRows + 1); 33 } 34 } 35 //新たな予定(更新も含む)を蓄積 36 values.push([ 37 eventId, 38 lastUpdated, 39 calendar.getName(), 40 event.getStartTime().toLocaleDateString('ja-JP'), 41 event.getStartTime().toLocaleTimeString('ja-JP'), 42 event.getEndTime().toLocaleDateString('ja-JP'), 43 event.getEndTime().toLocaleTimeString('ja-JP'), 44 ]); 45 } 46 } 47 } 48 //最終行に追記 49 if (values.length > 0) { 50 sheetTest.getRange(sheetTest.getLastRow() + 1, 1, values.length, values[0].length).setValues(values); 51 } 52}

投稿2023/06/30 07:10

YellowGreen

総合スコア861

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

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

mijinko.1204

2023/06/30 07:30

詳しくありがとうございます! 試してみます^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問