できること
自分が入っているグループチャットのメンバー一覧リストをスプレッドシートに一括で出力します。
細かい仕様
- ダイレクトチャットは除外します。
- 自分はリストから除外します。
使い方
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 文」を使用してエラーを無視することでちょっと強引に回避しました。
コメント