仕事でChatwork(フリープラン)を使っているが、今回(2022年10月から)40日以前の履歴が見れないという改変が行われる。もともと使いやすいとは思ってなかったし、正直飽きもあるのでもう別のサービスに変わりたい。ただここ数年間のログは取っておきたい。会社の方針で使い続けることも考えられるので、その場合の対策も。
まず、これまでのログについては
ブラウザの開発機能でJavaScriptを使えばすべてのログ採取が可能。APIからだと仕様で100件しか取れない(何か方法があるのかもしれないが)。
今後の記録はGASでwebアプリを作成してチャットワークのwebhookに設定。
スプレッドシートに記録していく。
function doPost(e) {//チャットワーク〇〇ルームに投稿/編集があったら実行→スプレッドシートに記録 CWのwebhookを使用 ルームIDはwebhookの設定で変更 let json = JSON.parse(e.postData.contents);//CWに投稿されたデータ let accountId = json.webhook_event.account_id;//投稿したアカウントID let name = idToName(accountId);//関数idToNameでアカウントIDを名前に変換 let messageId = json.webhook_event.message_id;//メッセージID let sendTime = json.webhook_event.send_time;//投稿時間(UNIXTIME) let updateTime = json.webhook_event.update_time;//編集時間 let jsonBody = json.webhook_event.body;//投稿内容 let addData = [];//スプレッドシートに書き込む配列 if(updateTime === 0){//新規投稿の場合updateTimeを空白にする sendTime = new Date(sendTime*1000); sendTime = _HHmm(sendTime); addData.push(messageId,name,jsonBody,sendTime,''); } if(sendTime === 0){//編集の場合sendTimeを空白にする updateTime = new Date(updateTime*1000); updateTime = _HHmm(updateTime); addData.push(messageId,name,jsonBody,'',updateTime); } let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1'); sheet.appendRow(addData);//最終行に追加(一行ずつ、一次元配列) } /*アカウントIDから名前を返す関数*/ function idToName(id){ let account = [ {name:'Aさん',id:'777777'}, {name:'Bさん',id:'222222'}, {name:'Cさん',id:'4444444'}, {name:'Dさん',id:'666666'} ]; //引数idでaccountオブジェクトをフィルタ、nameを取り出す let name = account.filter(x => x.id ==id).map(x => x.name); return name[0]; } /* 時刻の表記をHH:mmに変更 */ function _HHmm(str){ return Utilities.formatDate(str, 'JST', 'MM月dd日 HH:mm'); }
GASのdoPost()はコンテナバインドで作成しないとスプレッドシートが扱えないらしい。そうなると各チャットルームごとに別シートとスクリプトを用意する必要がある。やや煩雑だが、IMPORTRANGE関数などを使って一つにまとめることは可能。
これ、編集されたら前のを消すなんて面倒くさいことしてないから、ちょくちょく書き直す人の過程が全て記録されてしまう。なんか覗き見してるようで悪い気もして、今更記録してるって言いにくいな。