GoogleAppsScriptでGoogleカレンダーの予定をChatWorkで通知させる


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#[email protected]";
  let calendar = CalendarApp.getCalendarById(calendarId);
  let todayEvents = calendar.getEventsForDay(today);
  if(todayEvents.length > 0){
    return true;
  }

  return false;
}

最後に

変数の付け方など適当ですが…ご容赦を。。
良かったら使ってみてください。