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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

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

ChatWork

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

Q&A

解決済

2回答

1098閲覧

チャットワークAPI×GAS 配信用チャットグループの追加されたメンバーを取得する

kuraris

総合スコア10

Google Apps Script

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

ChatWork

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

0グッド

0クリップ

投稿2022/04/14 09:03

編集2022/04/15 00:41

実現したいこと

配信型チャットワークのグループに新規の参加者が追加された時、その参加者の名前が別のグループチャットへ通知されるようにしたい。
同時にスプレッドシートに参加者一覧を書き出したい。

起きている問題

今まで使用していた差分を取得する関数が動かないようで(スプレッドシートが更新されていないため)、チャットワークに通知が返ってきません。
(いろいろと試行錯誤しすぎてごちゃごちゃになっていると思います……)

前提

①配信型グループチャットは、管理者権限以外のメンバーが「参加者一覧が見えない」「チャットの送信が出来ない」設定となっている。
②別に運営グループチャットがあり、そこに新規に追加された参加者が通知されるようにしたい。
(追加の度に通知されるのが望ましいが、特定のワード(例:登録者数確認)を送信して結果が返ってくる仕様でも可)
③スプレッドシートに参加者一覧も作りたい。

試したこと

元は手動でスクリプトを動かして、スプレッドシートに最新の参加者一覧を取得し、前回の結果から差分を出していたのですが、参加人数が増えてきたことと、管理者権限のない担当者が加入してくれたかその場で知りたいとの要望で、作り直すことになりました。

▼参考にしたサイト
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; }

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/04/14 22:58 編集

GAS(エディタ)の方で、何かエラーのようなもの(例:「失敗しました」というメッセージ)は出ていますか? あと、メンバー記録シートで、なぜ2列分記録しているのでしょうか。(それぞれの列の意味)
kuraris

2022/04/15 00:37

GASの方で「失敗しました」というエラーが出ています。 //シートに貼付 sheet.getRange(1,1,pastedata.length,pastedata[0].length).setValues(pastedata); sheet.getRange(1,2,putarry.length,putarry[0].length).setValues(putarry); この部分のことでしょうか? 上は最新のメンバー一覧を貼り付けるもので、下は前回と最新の差異をスプレッドシートでも見れるようにするために転記しています。
guest

回答2

0

一から作り直したところ、すんなりと動きました。
qnoirさんから教えて頂いた箇所も制御を入れました!ありがとうございました!

var HOST_API_TOKEN = '運営アカウントのAPI'; var LIVE_API_TOKEN = '配信アカウントのAPI'; var SHEETNAME = "シート1"; function doPost(e) { var json = JSON.parse(e.postData.contents); /* リクエスト用パラメータ・URLの準備 */ var params = { headers : {"X-ChatWorkToken" : HOST_API_TOKEN}, method : "post" }; var roomId = json.webhook_event.room_id; url = "https://api.chatwork.com/v2/rooms/" + roomId + "/messages"; /* json内に「登録者確認」メッセージがあればチャットワークに送信 */ if(json.webhook_event.body === "登録者確認"){ var accountId = json.webhook_event.account_id; var messageId = json.webhook_event.message_id; var newlist = getMember(); var body = '' body += '[rp aid=' + accountId; body += ' to=' + roomId + '-' + messageId + '] ' body += '[info][title]新規登録者数[/title]' for (let i = 0; i < newlist.length; i++) { body += newlist[i] + '\n' } if(newlist == ''){ body += '新規登録者なし' } body += `[/info]` params.payload = {body :body}; UrlFetchApp.fetch(url, params); } } function getMember(){ // シートを読込み 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]); }); //最新 var liveparams = { headers : {"X-ChatWorkToken" : LIVE_API_TOKEN}, method : "get" }; var liveroomId = '配信ルームのid'; //ルームid var liveurl = "https://api.chatwork.com/v2/rooms/"+liveroomId+"/members"; var strRespons = UrlFetchApp.fetch(liveurl, liveparams); var livejson = JSON.parse(strRespons.getContentText()); // 中身がなかったら終了 if( strRespons.getContentText() == "" ) return false; var livevalues = []; // jsonの内容を追加 livejson.forEach(function(obj){ var line = obj.name ; livevalues.push( line ); }); //前回取得分と最新取得分の差分を求める var diff_list = livevalues.filter(function(e) {return oldvalues.indexOf(e) == -1}); Logger.log(diff_list); //スプレッドシートに貼付 //差分がない場合は終了 if(diff_list == "") return false; // シートをクリア sheet.clearContents(); //最新取得分を貼付 var ary = []; for (var i=0; i<livevalues.length; i++) { ary.push([livevalues[i]]); } sheet.getRange(1,1,ary.length,1).setValues(ary); return diff_list; } function getSheet(){ var book = SpreadsheetApp.getActiveSpreadsheet(); return book.getSheetByName(SHEETNAME); }

投稿2022/04/15 09:35

kuraris

総合スコア10

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

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

0

ベストアンサー

・BOT_API_TOKENがwebhookのAPIトークンになっていませんか?
ルームメンバーを取得する場合は、webhookではなく、通常のAPIトークンを使わないと
invalid tokenエラーが発生します。

・メンバーに変化がない場合、
diff_listは空配列となり、
putarryも空配列のままになります。
この状態で

sheet.getRange(1,2,putarry.length,putarry[0].length).setValues(putarry);

が実行されると、
putarry[0].length がundefinedエラーになります。
したがって、putarryが空配列のときは、貼付け処理をスキップする必要があります。

投稿2022/04/15 03:42

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問