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

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

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

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

ChatWork

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

解決済

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

kuraris
kuraris

総合スコア10

Google Apps Script

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

ChatWork

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

2回答

0評価

0クリップ

307閲覧

投稿2022/04/14 09:03

編集2022/04/15 18:35

実現したいこと

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

起きている問題

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

前提

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

試したこと

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

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

qnoir

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); この部分のことでしょうか? 上は最新のメンバー一覧を貼り付けるもので、下は前回と最新の差異をスプレッドシートでも見れるようにするために転記しています。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Google Apps Script

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

ChatWork

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