前提・実現したいこと
ChatWorkでタスクリマインド機能をつけたい(平日限定)
発生している問題・エラーメッセージ
現在発生している現象は下記になります。 ・実行完了をしても営業日のみの稼働がされない ・実行しても、投稿されるルームIDと投稿されないルームIDがある
// 指定された日が営業日か(営業日 = 「土日でない」「祝日カレンダーに予定がない」) // 営業日 = true function isWorkday (targetDate) { // targetDate の曜日を確認、週末は休む (false) var rest_or_work = ["REST","mon","tue","wed","thu","fri","REST"]; // 日〜土 if ( rest_or_work [targetDate.getDay ()] == "REST" ) { return false; }; // 祝日カレンダーを確認する var calJpHolidayUrl = "ja.japanese#holiday@group.v.calendar.google.com"; var calJpHoliday = CalendarApp.getCalendarById (calJpHolidayUrl); if (calJpHoliday.getEventsForDay (targetDate).length != 0) { // その日に予定がなにか入っている = 祝祭日 = 営業日じゃない (false) return false; } ; // 全て当てはまらなければ営業日 (True) return true; } /*---- 初期設定ここから ----*/ // チャットワークAPIトークンを設定 var ChatWorkToken = 'XXXXXXXXXX'; // 設定用シートのシート名 var SHEETNAME = 'シート1'; /*---- 初期設定ここまで ----*/ // 管理用メニューを追加 function onOpen() { SpreadsheetApp.getUi() .createMenu('管理用') .addItem('最新のルーム一覧を読込む', 'getRooms') .addItem('いますぐリマインド実行', 'myFunction') .addToUi(); } // リマインド実行のメインのファンクション function myFunction(){ // スプレッドシート読み込み // spreadsheet読込->json取得 var sheet = getSheet(); var json = convertSheet2Json(sheet); if( json == false ){ Browser.msgBox( "シートに何もありません" ); return false; } // ルーム毎にリマインド for(var i=0; i<json.length; i++) { var obj = json[i]; if( obj.num_of_days !== '' ){ // ルーム毎にリマインド //Logger.log( obj.room_id + ", " + obj.num_of_days ); sendRemind( obj.room_id, obj.num_of_days); } } } // 最新のルーム一覧を読込む function getRooms(){ // シートを読込み var sheet = getSheet(); var previousValues = readSheet(sheet); // 既存の設定をルームIDをキーにした連想配列に残す var array = []; if( previousValues != false ){ for(var i=0; i<previousValues.length; i++) { var key = previousValues[i][0]; var value = previousValues[i][1]; array[key] = value; } } // ルーム一覧を読み込み // ChatWork apiに投げるパラメータを設定 var params = { headers : {"X-ChatWorkToken" : ChatWorkToken}, method : "get" }; //ルーム一覧を取得するURL var url = "https://api.chatwork.com/v2/rooms"; //チャットワークAPIエンドポイントからレスポンスを取得 var strRespons = UrlFetchApp.fetch(url, params); // 中身がなかったら終了 (2018/6/11修正) if( strRespons.getContentText() == '' ){ return false; } // シートをクリア sheet.clearContents(); // レスポンス文字列をJSON形式として解析しJSONオブジェクトとして返す var json = JSON.parse(strRespons.getContentText()); // 二次元配列を作成し、シートに貼り付ける // 配列を定義 var values = []; // 1行目はフィールド名を挿入 values[0] = [ 'ルームID', 'リマインド日数', 'ルーム名' ]; // jsonの内容を2行目以降に追加 var i = 1; json.forEach(function(obj) { var num_of_days = ( array[obj.room_id] )? array[obj.room_id] : ''; var line = [ obj.room_id, num_of_days, obj.name ]; values.push( line ); }); // シートに貼付け sheet.getRange(1,1,values.length,values[0].length).setValues( values ); } function sendRemind(room_id, num_of_days){ // ルームのタスクを読込み // ChatWork apiに投げるパラメータを設定 var params = { headers : {"X-ChatWorkToken" : ChatWorkToken}, method : "get" }; // 未完了のタスクを取得するURL var url = "https://api.chatwork.com/v2/rooms/" + room_id + "/tasks?status=open"; //チャットワークAPIエンドポイントからレスポンスを取得 var strRespons = UrlFetchApp.fetch(url, params); // 中身がなかったら終了 (2018/6/11修正) if( strRespons.getContentText() == '' ){ return false; } // レスポンス文字列をJSON形式として解析しJSONオブジェクトとして返す var json = JSON.parse(strRespons.getContentText()); // 昇順で並べ替え json.sort(function(a,b){ if(a.limit_time < b.limit_time) return -1; if(a.limit_time > b.limit_time) return 1; return 0; }); // 現在の日付取得 var nowDate = new Date(); // リマインドする最大の日付の23:59:59をセットする var refDate = new Date(); refDate.setDate( nowDate.getDate() + num_of_days ); refDate.setHours(23); refDate.setMinutes(59); refDate.setSeconds(59); /* チャットワークに送る文字列のヘッダー */ var strBody = "[info][title][toall]\n????おはようございます![/title]"; // 前回の日付を代入して比較する変数 var lastLimitDate = ''; // タスク毎に予定を作成 json.some(function(obj) { // 期限なしタスクなら何もせず次へ if( obj.limit_time == 0 ) return false; // タスクの期限を取得 var date = new Date( obj.limit_time * 1000 ); // リマインド必要な日付でなければループを抜ける if( date > refDate ) return true; // タイトルを設定 var title = obj.body; title = title.split(String.fromCharCode(10)).join(' '); // 改行をスペースに置換 title = title.replace(/[/g, "<"); // chatworkのタグを "[" → "<" に変換 title = title.replace(/]/g, ">"); // chatworkのタグを "]" → ">" に変換 title = title.replace(/<("[^"]*"|'[^']*'|[^'">])*>/g, ""); // タグを削除 title = title.substring(0,50); // タイトルは50文字で切る // 日付を文字列に変換 var strDate = date.getMonth()+1 +"月" + date.getDate() + "日"; // var limit = ''; if( nowDate > date ){ limit = ( date.getFullYear() === nowDate.getFullYear() && date.getMonth() === nowDate.getMonth() && date.getDate() === nowDate.getDate() )?'????本日' + strDate + 'まで' :'????期限切れタスクだよ!\n????'+ strDate + 'まで'; } // 日付が異なる場合は水平線挿入 var hr = ( lastLimitDate == '' || lastLimitDate == limit )? '' : '[hr]'; if( lastLimitDate == '' || lastLimitDate != limit ) hr = hr + limit + ':\n' + ' '; strBody = strBody + hr + '[picon:' + obj.account.account_id + '] ' + title + '\n'; //チャットワークに送る文字列にタスクを追加 lastLimitDate = limit; }); // リマインド不要なら終了 if( lastLimitDate == '' ) return false; // インフォタグを閉じる strBody = strBody + '[/info]'; // ルームにメッセージ送信 sendMessage(room_id, strBody); return true; } function getSheet(){ var book = SpreadsheetApp.getActiveSpreadsheet(); return book.getSheetByName(SHEETNAME); } // シートを読み込んでjson形式で返す function convertSheet2Json(sheet) { // シートを読み込んで二次元配列を返す var values = readSheet(sheet); if( values == false ) return false; // create json var jsonArray = []; for(var i=0; i<values.length; i++) { var json = new Object(); json['room_id'] = values[i][0]; json['num_of_days'] = values[i][1]; jsonArray.push(json); } return jsonArray; } // シートを読み込んで二次元配列を返す function readSheet(sheet){ var lastRow = sheet.getLastRow(); if( lastRow <= 1 ) return false; var rowIndex = 2; var colStartIndex = 1; var colNum = 2; var range = sheet.getRange(rowIndex, colStartIndex, lastRow, colNum); var values = range.getValues(); return values; } // メッセージ送信 function sendMessage(room_id, strBody){ var params = { headers : {"X-ChatWorkToken" : ChatWorkToken}, method : "post", payload : { body : strBody } }; var url = "https://api.chatwork.com/v2/rooms/" + room_id + "/messages"; UrlFetchApp.fetch(url, params); }
試したこと
補足情報(FW/ツールのバージョンなど)
参考URLは下記です。
https://life89.jp/chatwork_task_reminder/
https://dev.classmethod.jp/articles/202001-workday-only-gas/
あなたの回答
tips
プレビュー