【チャットワークAPI】グループチャットのメンバー一覧を取得するGAS

Google Apps Script

できること

自分が入っているグループチャットのメンバー一覧リストをスプレッドシートに一括で出力します。

細かい仕様

  • ダイレクトチャットは除外します。
  • 自分はリストから除外します。
  • 2022/11/25 V8 runtime(ES6)に対応するためコードを修正しました

使い方

Googleスプレッドシートを新規作成し、ツール > スクリプトエディタ を開きます。
下のコードをまるっとコピペして、チャットワークAPIトークンをご自分のものに書き換えてください。
スクリプトを実行すると「シート1」に一覧リストが出力されます。

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

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

// 設定用シートのシート名
var SHEETNAME = "シート1";

// ルームIDの指定(空の場合は全ルーム取得)
var ROOM_ID = "";

//---- 初期設定ここまで -----------

// 最新のルーム一覧を読込む
function getRooms(){

  // シートを読込み
  var sheet = getSheet();
  
  // 自分のchatworkIDを取得
  var myAccountId = getMyAccountId();
  
  // ルーム一覧を読み込み
  // 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);

  // 中身がなかったら終了 
  if( strRespons.getContentText() == "" ) return false;
  
  // レスポンス文字列をJSON形式として解析しJSONオブジェクトとして返す
  var json = JSON.parse(strRespons.getContentText());

  // 二次元配列を作成し、シートに貼り付ける
  // 配列を定義
  var values = [];
  // 1行目はフィールド名を挿入
  values[0] = [ "ルームID", "ルーム名", "アカウントID", "ロール", "名前", "ChatWorkID", "組織ID", "組織名", "部署名" ];
  
  // jsonの内容を2行目以降に追加
  for(var obj of json){
    if(obj.type == "group" && ( ROOM_ID == "" || obj.room_id == ROOM_ID )){
      var members = getMembers(obj.room_id, obj.name, myAccountId);
      if(!members)continue;
      values = values.concat(members);
    }
  }
  
  // シートをクリア
  sheet.clearContents();

  // シートに貼付け
  sheet.getRange(1,1,values.length,values[0].length).setValues( values );

}

function getMyAccountId(){
  // ChatWork apiに投げるパラメータを設定
  var params = {
    headers : {"X-ChatWorkToken" : ChatWorkToken},
    method : "get"
  };

  // エンドポイント
  var url = "https://api.chatwork.com/v2/me";

  //チャットワークAPIエンドポイントからレスポンスを取得
  var strRespons = UrlFetchApp.fetch(url, params);

  // 中身がなかったら終了
  if( strRespons.getContentText() == "" ) return false;
  
  // レスポンス文字列をJSON形式として解析しJSONオブジェクトとして返す
  var json = JSON.parse(strRespons.getContentText());
  
  return json.account_id;
}

function getMembers(room_id, room_name, myAccountId){
    
  // ルーム一覧を読み込み
  // ChatWork apiに投げるパラメータを設定
  var params = {
    headers : {"X-ChatWorkToken" : ChatWorkToken},
    method : "get"
  };

  // エンドポイント
  var url = "https://api.chatwork.com/v2/rooms/"+room_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 = [];
  
  // jsonの内容を追加
  for(var obj of json){
    if( obj.account_id != myAccountId ){
      var line = [ room_id, room_name, obj.account_id, obj.role, obj.name, obj.chatwork_id, obj.organization_id, obj.organization_name, obj.department ];
      values.push( line );
    }
  }
  return values;
}

function getSheet(){
  var book = SpreadsheetApp.getActiveSpreadsheet();
  return book.getSheetByName(SHEETNAME);
}

注意点

チャットやメンバーが多い場合はGASのタイムリミット(6分)以内に処理が終わらずタイムアウトする可能性があります。

ハマったポイント

チャットワークAPIでは「チャットの参加者一覧を表示する」の設定を取得できない

「チャットの参加者一覧を表示する」の設定がオフになっているグループで「メンバー」および「閲覧のみ」ユーザになっている場合、メンバー一覧取得のAPIを投げると「権限がありません」とエラーが返ってきます。

これを回避しようとして、ルーム情報を取得するAPIのレスポンスを見たんですが、「チャットの参加者一覧を表示する」に関する情報が…

…なかったー!

なので、「try…catch 文」を使用してエラーを無視することでちょっと強引に回避しました。

コメント

  1. うっちー より:

    大変有用なスクリプトを共有いただきありがとうございます。
    早速、実行してみたのですが、ご紹介いただいたスクリプトを実行すると以下のエラーが表示されます。
    Syntax error: SyntaxError: Unexpected identifier line: 51 file: Code.gs

    51行目は 「for each(var obj in json){」ですが、現在の最新バージョンのGAS(Apps Script)でも問題なく動くスクリプトでしょうか。

    • ながすん より:

      コメントありがとうございます!
      2018年にアップしたままでしたので、V8 runtime(ES6)に対応するようにコードを修正しました!

  2. うっちー より:

    こんなにも早くご対応いただけるとは思ってもみませんでした。誠にありがとうございます。

    修正いただいたバージョンを実行したところ、エラーは表示されなくなりましたが、メンバー一覧がスプレッドシートに出力されずシート全体がブランクのままとなってしまいました。
    room IDをペーストする箇所がなかったのですが、私のほうでroom IDを明示する必要はないのでしょうか。APIトークンは入力しており、シート名もマッチしております。

    • ながすん より:

      たまたまメールでコメント通知を見つけたのですぐに対応できましたw

      元々全ルームから取得してくる仕様だったのでルームIDの指定が不要だったのですが、指定できるように修正しました!

      > シートに出力されずシート全体がブランクのまま
      ルームが多いと実行に時間がかかってタイムアウトしてブランクのままになることがあります。
      今回の修正でルームIDを指定すれば処理が早くなるので、この事象を回避できるかも知れません。

  3. うっちー より:

    結果は変わらずで1秒経過する前にスクリプトの処理が完了し、シートはブランクのままでした。 ルームの数は5つぐらいで、それぞれ100~500程度のメンバー数になります。
    おそらくGASを触るのが今日初めての私の使い方が間違っているのだと思われます。これ以上、お手間を取らせてしまうのも申し訳ないので、使い方を学習してからもう一度試してみたいと思います。何度も申し訳ありませんでした。
    見ず知らずであるにも関わらず、丁寧にご対応いただき、ありがとうございました。

    • ながすん より:

      ありがとうございます!

      あとは使用しているトークンのアカウントでメンバー一覧の閲覧権限がないという可能性も考えられます。
      テスト用にグループチャットをつくってみるなどして動作確認してみるとよいかもしれません。

タイトルとURLをコピーしました