1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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;
}

最後に

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

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?