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

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

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

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

ChatWork

業務の効率化を目的としたコミュニケーションツール。 グループチャット、ビデオ・音声通話、ファイル共有、タスク管理などの機能を備えています。マルチデバイス対応で、ブラウザだけでなくタブレットやスマートフォンでも利用可能です。

Q&A

2回答

2836閲覧

【GAS】取得した複数のGoogleカレンダーのイベントをソートしたい

nori_cln

総合スコア0

Google Apps Script

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

ChatWork

業務の効率化を目的としたコミュニケーションツール。 グループチャット、ビデオ・音声通話、ファイル共有、タスク管理などの機能を備えています。マルチデバイス対応で、ブラウザだけでなくタブレットやスマートフォンでも利用可能です。

0グッド

1クリップ

投稿2021/10/12 01:03

GASを利用して、Googleカレンダーから複数のカレンダーのイベントを取得し、Chatworkのルームに転記しています。
問題なく動いていますが、以下のように表示されるため、開始時間でソートしたいと考えています。

Chatworkに転記した結果

09:00 - 10:00 : A 面談
11:00 - 12:00 : A 面談
08:30 - 09:30 : B 外出
13:30 - 16:00 : B 外出
10:00 - 17:00 : C 委員会

該当のソースコード

GAS

1function notifyDuty() { 2 var date = new Date(); 3 4 if(isBusinessDay(date)){ 5 deleteTrigger(); 6 get_Today_Schedule(); 7 }else{ 8 Logger.log('休日です'); 9 } 10} 11 12// その日の8時30分にトリガーを設定 13function setTrigger() { 14 var triggerDay = new Date(); 15 triggerDay.setHours(8); 16 triggerDay.setMinutes(30); 17 ScriptApp.newTrigger("notifyDuty").timeBased().at(triggerDay).create(); 18} 19 20// その日のトリガーを削除する関数(消さないと残る) 21function deleteTrigger() { 22 var triggers = ScriptApp.getProjectTriggers(); 23 for(var i=0; i < triggers.length; i++) { 24 if (triggers[i].getHandlerFunction() == "notifyDuty") { 25 ScriptApp.deleteTrigger(triggers[i]); 26 } 27 } 28} 29 30//営業日の判断をする関数 31function isBusinessDay(date){ 32 if (date.getDay() == 0 || date.getDay() == 6 ) { 33 return false; 34 } 35 var calJa = CalendarApp.getCalendarById('addressbook#contacts@group.v.calendar.google.com'); 36 if(calJa.getEventsForDay(date).length > 0){ 37 return false; 38 } 39 return true; 40} 41 42/*カレンダーのIDを取得*/ 43function get_Calendar() { 44 var arrCals=[]; 45 arrCals.push(CalendarApp.getCalendarById('XXXX@group.calendar.google.com'));//A 46 arrCals.push(CalendarApp.getCalendarById('xxxx@group.calendar.google.com'));//B 47 arrCals.push(CalendarApp.getCalendarById('xxxx@group.calendar.google.com'));//C 48 return arrCals; 49} 50 51/*今日の予定を取得するメインの関数*/ 52function get_Today_Schedule(){ 53 var arrCals = get_Calendar();//カレンダーID取得 54 var date = new Date(); 55 date.setDate(date.getDate());//日付に今日を指定 56 var strIntro = "[info][title]今日の予定[/title]"; 57 var strBody = strIntro; 58 /*カレンダーの今日のイベント取得*/ 59 for (var i = 0 ; i< arrCals.length ; i++){ 60 strBody = strBody + getEvents(arrCals[i],date); 61 } 62 63 if (strBody == strIntro){ 64 strBody = "[info][title]今日の予定[/title]予定はありません。" ; 65 } 66 67 strBody = strBody + '[/info]'; 68 69 /* チャットワークにメッセージを送る */ 70 var cwClient = ChatWorkClient.factory({token: 'xxxx'}); //チャットワークAPI 71 cwClient.sendMessage({ 72 room_id:xxxx, //送信先ルームID 73 body: strBody 74 }); 75} 76 77/*カレンダーのイベント取得*/ 78function getEvents(Cals,getDate){ 79 var arrEvents = Cals.getEventsForDay(getDate); 80 var strEvents =""; 81 for (var i=0; i<arrEvents.length; i++){ 82 var strTitle = arrEvents[i].getTitle(); 83 var strStart = _HHmm(arrEvents[i].getStartTime()); //開始時刻 84 var strEnd = _HHmm(arrEvents[i].getEndTime()); //終了時刻 85 if (strStart == strEnd){ 86 strEvents = strEvents + '終日イベント:' + strTitle + '\n'; 87 }else{ 88 strEvents = strEvents + strStart + ' - ' + strEnd+ ' : ' + strTitle + '\n'; 89 } 90 } 91 return strEvents; 92} 93 94/*時間の表示変更*/ 95function _HHmm(str){ 96 return Utilities.formatDate(str,'JST','HH:mm'); 97}

考えていること

strEventsの辺りに処理を追加するか、一度スプレッドシートに書き出してソートするのも解決策かと思いますが、どちらも具体的なコードまでイメージできていません。

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

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

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

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

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

guest

回答2

0

このコードを前任者(?)が考えたときは、カレンダーごとにイベントを出すことに意味を感じてたのではないかと思いました。

イベントが時刻順に並んでないことは、この通知を見る全員にかかわりのあるイベントでは奇妙かもしれませんが、個人やチームごと、あるいは取引先グループごとにカレンダーを管理している場合などにはこういう出しかたをすることがむしろ有効である状況が考えられます。

そうなってくると、カレンダー名を出したほうがいいのかとか、いろいろ考えることが広がるので、これをこのまま使い回して有用なのかが疑問です。

javascript

1const notifyDuty = () => { 2 if(isBusinessDay(new Date())){ 3 deleteTrigger(); 4 send(get_Today_Schedule()); 5 return; 6 } 7 Logger.log('休日です'); 8} 9 10// その日の8時30分にトリガーを設定 11const setTrigger = () => { 12 const today = new Date(); 13 today.setHours(8,30); 14 ScriptApp.newTrigger("notifyDuty").timeBased().at(today).create(); 15} 16 17// その日のトリガーを削除する関数(消さないと残る) 18const deleteTrigger = () => { 19 for(const trigger of ScriptApp.getProjectTriggers()) { 20 if (trigger.getHandlerFunction() == "notifyDuty") { 21 ScriptApp.deleteTrigger(trigger); 22 } 23 } 24} 25 26//営業日の判断をする関数 27const isBusinessDay = (date) => { 28 if (date.getDay() == 0 || date.getDay() == 6 ) { 29 return false; 30 } 31 const calJa = CalendarApp.getCalendarById('addressbook#contacts@group.v.calendar.google.com'); 32 if(calJa.getEventsForDay(date).length > 0){ 33 return false; 34 } 35 return true; 36} 37 38/*カレンダーのIDを取得*/ 39const get_Calendar = () => [ 40 CalendarApp.getCalendarById('XXXX@group.calendar.google.com'),//A 41 CalendarApp.getCalendarById('xxxx@group.calendar.google.com'),//B 42 CalendarApp.getCalendarById('xxxx@group.calendar.google.com'),//C 43]; 44 45/*今日の予定を取得するメインの関数*/ 46const get_Today_Schedule = () => { 47 const today = new Date(); //日付に今日を指定 48 const events = get_Calendar().map(c => c.getEventsForDay(today)).flat().sort(calendarEventspararer); 49 if(events.length < 1) return "[info][title]今日の予定[/title]予定はありません。[/info]"; 50 let message = "[info][title]今日の予定[/title]"; 51 message += getEvents(events); 52 message += '[/info]'; 53 return message; 54} 55 56/*カレンダーのイベントを文字化*/ 57const getEvents = (events) => { 58 let eventMessage = ""; 59 for (const event of events){ 60 const title = event.getTitle(); 61 if(event.isAllDayEvent()) { 62 eventMessage += `終日イベント:${strTitle}\n`; 63 continue; 64 } 65 const start = _HHmm(event.getStartTime()); //開始時刻 66 const end = _HHmm(event.getEndTime()); //終了時刻 67 eventMessage += `${start} - ${end} : ${title}\n`; 68 } 69 return eventMessage; 70} 71 72/* チャットワークにメッセージを送る */ 73const send = (message) => { 74 const cwClient = ChatWorkClient.factory({token: 'xxxx'}); //チャットワークAPI 75 cwClient.sendMessage({ 76 room_id:"xxxx", //送信先ルームID 77 body: message 78 }); 79} 80/*時間の表示変更*/ 81const _HHmm = (date) => Utilities.formatDate(date,'JST','HH:mm'); 82 83const calendarEventspararer = (event1, event2) => { 84 if(event1.getStartTime() > event2.getStartTime()) { return 1;} 85 if(event1.getStartTime() < event2.getStartTime()) { return -1;} 86 if(event1.getEndTime() > event2.getEndTime()) { return 1;} 87 if(event1.getEndTime() < event2.getEndTime()) { return -1;} 88 return 0; 89}

投稿2021/10/15 17:48

編集2021/10/15 17:49
papinianus

総合スコア12705

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

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

0

getEventsでは1つの文字列にループで予定を付け足していったものを返しており、
これをループで呼び出して、その結果もまた1つの文字列に付け足していっていますね。
つまり二重ループで1つの文字列をつくっていることになります。

1つの文字列にしてしまってからでは並べ替えは難しいですから、
まずは上記の処理を、1つの文字列に付け足していくのではなく、
予定を配列の要素として加えていくよう変えるべきだと思います。

配列に要素を追加するにはArray.push()などを用います。

Array.prototype.push() - JavaScript | MDN

そうして予定を配列にすれば、Array.sort()で好きなように並べ替えができます。

Array.prototype.sort() - JavaScript | MDN

そうして並べ替えをした配列を、Array.join()で文字列化すれば良いでしょう。

Array.prototype.join() - JavaScript | MDN

投稿2021/10/12 03:26

編集2021/10/12 03:28
itagagaki

総合スコア8402

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問