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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

ChatWork

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

Q&A

0回答

772閲覧

ChatWorkでタスクリマインドの機能をつけたいが、正しく実行されない場合とされる場合がある

daiki00000

総合スコア1

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

ChatWork

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

0グッド

0クリップ

投稿2021/04/28 00:17

前提・実現したいこと

使用ツール
・Chatwork+API
・GAS
・スプレッドシート

発生している問題・エラーメッセージ

現状確認している問題点は下記です。
①実行完了と表記がでるが、対象の時間になってもメッセージが投稿されない、もしくは実行される場合と時々で動きが違う
②スプレッドシートで設定したリマインド日数が更新の度に削除されてしまう。
③投稿されるルームIDと、投稿されないIDがある

Exception: Request failed for https://api.chatwork.com returned code 502. Truncated server response: {"errors":["Too many requests"]} (use muteHttpExceptions option to examine full response) sendRemind @ タスクリマインド機能.gs:112 myFunction @ タスクリマインド機能.gs:37

該当のソースコード※XXXはAPIです。

/---- 初期設定ここから ----/

// チャットワークAPIトークンを設定
var ChatWorkToken = 'XXXXXXXXXXXXXXXXXXX';

// 設定用シートのシート名
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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問