
実現したいこと
配信型チャットワークのグループに新規の参加者が追加された時、その参加者の名前が別のグループチャットへ通知されるようにしたい。
同時にスプレッドシートに参加者一覧を書き出したい。
起きている問題
今まで使用していた差分を取得する関数が動かないようで(スプレッドシートが更新されていないため)、チャットワークに通知が返ってきません。
(いろいろと試行錯誤しすぎてごちゃごちゃになっていると思います……)
前提
①配信型グループチャットは、管理者権限以外のメンバーが「参加者一覧が見えない」「チャットの送信が出来ない」設定となっている。
②別に運営グループチャットがあり、そこに新規に追加された参加者が通知されるようにしたい。
(追加の度に通知されるのが望ましいが、特定のワード(例:登録者数確認)を送信して結果が返ってくる仕様でも可)
③スプレッドシートに参加者一覧も作りたい。
試したこと
元は手動でスクリプトを動かして、スプレッドシートに最新の参加者一覧を取得し、前回の結果から差分を出していたのですが、参加人数が増えてきたことと、管理者権限のない担当者が加入してくれたかその場で知りたいとの要望で、作り直すことになりました。
▼参考にしたサイト
https://qiita.com/kz800/items/08c2d012f93f29501330
配信型のグループチャットはチャット送信に制限を掛けているので、丸々参考にすることは出来ず、特定ワード(登録者数確認)で起動するように作っています。(自動で通知が飛んでくるのが一番理想。可能なのか調べきれなかったのでこの方法に……)
該当のソースコード
var API_TOKEN = 'グループA(配信用グループチャットの管理権限があるアカウントのAPI)'; var BOT_API_TOKEN = 'グループB(運用グループのAPI)'; var getroom_id = 'グループAのルームid'; var SHEETNAME = "シート1"; function doPost(e) { var json = JSON.parse(e.postData.contents); var params = { headers : {"X-ChatWorkToken" : BOT_API_TOKEN}, method : "post", }; var roomId = json.webhook_event.room_id; var url = "https://api.chatwork.com/v2/rooms/" + roomId + "/messages"; if(json.webhook_event.body === "登録者数確認"){ var accountId = json.webhook_event.account_id; var messageId = json.webhook_event.message_id; var newMember = getArrayDiff(); if (newMember.length > 0) { var body = '' body += '[rp aid=' + accountId; body += ' to=' + roomId + '-' + messageId + '] ' body += '[info]新規登録者[/info]' params.payload = {body :body + createList(newMember)}; UrlFetchApp.fetch(url, params); } } } function getArrayDiff(){ // シートを読込み var sheet = getSheet(); //前回 // セルの範囲を取得する var lastRow = sheet.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); var range = SpreadsheetApp.getActiveSheet().getRange(1,1,lastRow,1) // セル範囲の値を配列で取得する var arry = range.getValues(); var oldvalues = []; arry.forEach(function(data){ oldvalues.push(data[0]); }); //最新 // ルーム一覧を読み込み // ChatWork apiに投げるパラメータを設定 var params = { headers : {"X-ChatWorkToken" : API_TOKEN}, method : "get" }; // エンドポイント var url = "https://api.chatwork.com/v2/rooms/"+getroom_id+"/members"; //チャットワークAPIエンドポイントからレスポンスを取得 try{ var strRespons = UrlFetchApp.fetch(url, params); }catch(e){ return false; } // 中身がなかったら終了 if( strRespons.getContentText() == "" ) return false; // レスポンス文字列をJSON形式として解析しJSONオブジェクトとして返す var json = JSON.parse(strRespons.getContentText()); // 配列を作成し、シートに貼り付ける // 配列を定義 var values = []; var pastedata = []; // jsonの内容を追加(差異用) json.forEach(function(obj){ var line = obj.name ; values.push( line ); // jsonの内容を追加(貼付用) var line2 = [obj.name] ; pastedata.push( line2 ); } ); //diff var diff_list = values.filter(function(e) {return oldvalues.indexOf(e) == -1}); // シートに貼付け var putarry = []; diff_list.forEach(function(diff_list){ var t = [diff_list] ; putarry.push( t ); }); // シートをクリア sheet.clearContents(); //シートに貼付 //最新のメンバー一覧を記録する sheet.getRange(1,1,pastedata.length,pastedata[0].length).setValues(pastedata); //前回と今回の差異をスプレッドシートにも記録する sheet.getRange(1,2,putarry.length,putarry[0].length).setValues(putarry); return putarry; } function getSheet(){ var book = SpreadsheetApp.getActiveSpreadsheet(); return book.getSheetByName(SHEETNAME); } //この辺りが試せていません function createList(putarry){ var message = ""; for (var i=0; i<putarry.length; i++) { message += putarry[i] + "\n"; } return message; }


回答2件
あなたの回答
tips
プレビュー