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

働き方改革

できること

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

細かい仕様

  • ダイレクトチャットは除外します。
  • 自分はリストから除外します。

使い方

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

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

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

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

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

// 最新のルーム一覧を読込む
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;

  // シートをクリア
  sheet.clearContents();
  
  // レスポンス文字列をJSON形式として解析しJSONオブジェクトとして返す
  var json = JSON.parse(strRespons.getContentText());

  // 二次元配列を作成し、シートに貼り付ける
  // 配列を定義
  var values = [];
  // 1行目はフィールド名を挿入
  values[0] = [ "ルームID", "ルーム名", "アカウントID", "ロール", "名前", "ChatWorkID", "組織ID", "組織名", "部署名" ];
  
  // jsonの内容を2行目以降に追加
  for each(var obj in json){
    if(obj.type == "group"){
      var members = getMembers(obj.room_id, obj.name, myAccountId);
      if(!members)continue;
      values = values.concat(members);
    }
  }
  
  // シートに貼付け
  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 each(var obj in 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 文」を使用してエラーを無視することでちょっと強引に回避しました。

コメント