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

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

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

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

Q&A

解決済

2回答

2070閲覧

Google カレンダーから隙間時間のみを抽出する

pon244

総合スコア59

Google Apps Script

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

0グッド

1クリップ

投稿2022/05/12 13:59

【環境】
マックブックPro

【したいこと】
1週間の9時から17時の間で会議が入ってない合計時間をスプレッドシートに抽出したい。
現状時間までは取得できるのですが、下記二つができません。ご教授お願い致します。

・9時から17時の間のみの指定
・数式に変更して会議以外の空き時間を数字として出す
【コード】

const CALENDAR_ID = 'xxx; //カレンダーID function getCalendarEvents() { const calendar = CalendarApp.getCalendarById(CALENDAR_ID); const startTime = new Date('2022/05/09 00:00:00'); const endTime = new Date('2022/05/13 00:00:00'); const events = calendar.getEvents(startTime, endTime); const values = []; for(const event of events){ const record = [ event.getTitle(), event.getStartTime(), event.getEndTime(), ]; values.push(record); } SpreadsheetApp.getActiveSheet().getRange(2, 1, values.length, values[0].length).setValues(values); }

【出力】
イメージ説明

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

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

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

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

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

k.a_teratail

2022/05/13 01:51 編集

> const endTime = new Date('2022/05/13 00:00:00'); こちらに関しては、平日1週間を想定の場合は「2022/05/13 23:59:59」で設定しないと 05/13の9時〜17時のイベントが取得できませんが、問題ないでしょうか? ----- 追記 回答にコード記載したので削除します。
k.a_teratail

2022/05/13 01:51 編集

回答に記載したので、ここも削除します
guest

回答2

0

ありがとうございます!
欲しかったデータが取れました!

投稿2022/05/13 08:02

pon244

総合スコア59

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

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

0

ベストアンサー

イメージ説明

イメージとしてはこのような感じでしょうか?
この結果になるコードは下記になります。

gs

1const CALENDAR_ID = 'xxx' //カレンダーID 2 3function getCalendarEvents() { 4 5 const calendar = CalendarApp.getCalendarById(CALENDAR_ID); 6 const startTime = new Date('2022/05/09 00:00:00'); 7 const endTime = new Date('2022/05/13 23:59:59'); 8 9 const events = calendar.getEvents(startTime, endTime); 10 11 const values = []; 12 for(const event of events){ 13 // 会議開始時間の時と分 14 let startTimeHours = event.getStartTime().getHours() 15 let startTimeMinutes = event.getStartTime().getMinutes() 16 17 // 会議終了時間の時と分 18 let endTimeHours = event.getEndTime().getHours() 19 let endTimeMinutes = event.getEndTime().getMinutes() 20 21 // 開始時間が9時00分より大きい場合、true 22 let startTimeFlg = (startTimeHours >= 9 && startTimeMinutes >= 0) ? true : false 23 // 終了時間が17時00分ちょうどの場合、true 24 let endTimeFlg = (endTimeHours == 17 && endTimeMinutes == 0) ? true : false 25 if (!endTimeFlg) { 26 // 終了時間が16時59分以内の場合、true 27 endTimeFlg = (endTimeHours <= 16 && endTimeMinutes <= 59) ? true : false 28 } 29 30 // 9時から17時のスケジュールのみ取得 31 if (startTimeFlg && endTimeFlg) { 32 33 const record = [ 34 event.getTitle(), 35 event.getStartTime(), 36 event.getEndTime() 37 ]; 38 values.push(record); 39 } 40 } 41 42 SpreadsheetApp.getActiveSheet().getRange(2, 1, values.length, values[0].length).setValues(values).setNumberFormat('yyyy/MM/dd H:mm:ss'); 43 44 // イベント時間を算出する数式設定 45 let formulaRow = values.length 46 let formulaCol = 1 47 let formulaValue = [] 48 49 for (let i = formulaCol; i <= formulaRow; i++) { 50 formulaValue.push([`=C${i+1}-B${i+1}`]) 51 } 52 53 // D列に数式を記載 54 SpreadsheetApp.getActiveSheet().getRange(2, 4, formulaValue.length, formulaValue[0].length).setFormulas(formulaValue).setNumberFormat('H:mm:ss') 55 56 // 集計時間と空き時間の算出と数式設定 57 // シートの最終行を取得 58 let lastRow = SpreadsheetApp.getActiveSheet().getLastRow() 59 let aggreAndFreeTimeValues = [] 60 aggreAndFreeTimeValues.push(['="時間集計"', `=SUM(D2:D${lastRow})`]) 61 aggreAndFreeTimeValues.push(['="空き時間"', `=("40:00:00"-D${lastRow+1})`]) 62 63 // 最終行+1のC、D列に数式を記載 64 SpreadsheetApp.getActiveSheet().getRange(lastRow + 1, 3, aggreAndFreeTimeValues.length, aggreAndFreeTimeValues[0].length).setFormulas(aggreAndFreeTimeValues).setNumberFormat('[h]:mm:ss') 65}

ご確認の方、よろしくお願いします。

投稿2022/05/13 01:50

k.a_teratail

総合スコア845

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問