GoogleAppsScriptでGoogleカレンダーの予定をChatWorkで通知させる
経緯
会社で予定をGoogleカレンダーで管理するということらしいので、急遽調査。
なんとか必要な動作ができた…。
※何かあっても責任は取れませんのでご注意を、、
参考サイト
こちらで比較的欲しい情報がありましたので、参考にしました。
https://teratail.com/questions/219287
仕様
- トリガーは一定時間間隔で発動
- 予定のない日は、「この日の予定はありません。」と表示させる。
- 予定の日付ごとに罫線を入れている(ChatWork用スタイリング)
- 土日と祝日は送信しないをコメントアウトしてます
- 基本的には何日先でも可能にしている(閏年とかは大丈夫かわからないが…)
コード
以下のコードを貼り付けたら動くはず…。
APIのキーなど必要な情報は事前に取得しておいてください。
事前準備が整い次第、コードを貼り付けてください。
そして、実行してみて確認を。
/* 指定のカレンダーの本日の予定をチャットワークに送る */
function sendSchedule() {
function getDateWeek(num) {
let _date_num;
let _date_num_year;
let _date_num_month;
let _date_num_day;
let _date_num_full_date = [];
let _cnt = 0;
let _date_num_arr = [];
let _date_num_info = {};
for (var i = 0; i < num; i++) {
if (i === 0) {
_date_num = new Date();
} else {
_cnt = i;
_date_num = new Date(new Date().setDate(new Date().getDate() + _cnt));
}
_date_num_arr[i] = _date_num;
_date_num_year = _date_num.getFullYear() + '年 ';
_date_num_month = _date_num.getMonth() + 1 + '月 ';
_date_num_day = _date_num.getDate() + '日';
_date_num_full_date[i] = _date_num_year + _date_num_month + _date_num_day;
}
_date_num_info.num_arr = _date_num_arr;
_date_num_info.full_date = _date_num_full_date;
return _date_num_info;
}
let date_num_info = getDateWeek(7);
//if(!isHoliday()){ // 土日と祝日は送信しない
let myCals=CalendarApp.getCalendarById('カレンダーのIDを入れてください'); //特定のIDのカレンダーを取得(カレンダーのIDはカレンダーを作成したgmailのアドレスです)
let allmyEvents = [];
for(let i=0; i<date_num_info.num_arr.length; i++) {
allmyEvents[i] = myCals.getEventsForDay(date_num_info.num_arr[i]);
}
let calendar_name = myCals.getName(); //カレンダー名取得
/* チャットワークに送る文字列のヘッダー */
let strBody = "[info][title]" + calendar_name + "の本日の利用予定:" + Utilities.formatDate(new Date(), 'JST', 'yyyy/MM/dd HH:mm:ss') + 'の通知' + "[/title]";
/* イベントの数だけ繰り返し */
for(let j=0;j<allmyEvents.length;j++) {
strBody = strBody + '\n' + date_num_info.full_date[j];
let hr_tag = '';
let br_tag = '';
let event_none_txt = '';
if(!allmyEvents[j].length){
event_none_txt = '\n' + 'この日の予定はありません。' + '[hr]';
hr_tag2 = '[hr]';
}
strBody = strBody + event_none_txt;
//Logger.log(event_none_txt);
let cnt = allmyEvents[j].length;
for(let i=0;i<allmyEvents[j].length;i++){
if(!allmyEvents[j][i].isAllDayEvent()){ // 終日イベントはスキップする
let strTitle=allmyEvents[j][i].getTitle(); //イベントのタイトル
let strStart=_HHmm(allmyEvents[j][i].getStartTime()); //イベントの開始時刻
let strEnd=_HHmm(allmyEvents[j][i].getEndTime()); //イベントの終了時刻
if (cnt == i + 1) {
hr_tag = '[hr]';
}
if (i === 0) {
br_tag = '\n';
}
strBody += br_tag + strStart + ' - ' + strEnd + ' ' + strTitle + hr_tag; //チャットワークに送る文字列にイベント内容を追加
}
}
}
strBody = strBody + '[/info]';
/* チャットワークにメッセージを送る */
let apiKey = 'apiKeyを入れてください';
let cwClient = ChatWorkClient.factory({token:apiKey}); //チャットワークAPI
let roomid = [roomidを入れてください]; // 送りたい部屋のURLのridより後ろの数字を入れます
for(let i=0;i<roomid.length;i++){
cwClient.sendMessage({
room_id:roomid[i], //ルームID
body: strBody
});
};
//};
}
/* 時刻の表記をHH:mmに変更 */
function _HHmm(str){
return Utilities.formatDate(str, 'JST', 'HH:mm');
}
/* 休みの日を判定*/
function isHoliday(){
let today = new Date();
//土日か判定
let weekInt = today.getDay();
if(weekInt <= 0 || 6 <= weekInt){
return true;
}
//祝日か判定
let calendarId = "ja.japanese#holiday@group.v.calendar.google.com";
let calendar = CalendarApp.getCalendarById(calendarId);
let todayEvents = calendar.getEventsForDay(today);
if(todayEvents.length > 0){
return true;
}
return false;
}
最後に
変数の付け方など適当ですが…ご容赦を。。
良かったら使ってみてください。