GASでチャットワークのグループ追加を自動化しよう

みなさん、こんにちは!
現役エンジニアの”ます”です。

今回はGoogle Apps ScriptとChatwork APIを活用したグループ作成の自動化について解説していきます。

私が務めている会社ではチャットワークを活用しており、毎月新入社員が入るとグループの追加が必要になります。
この作業が地味に面倒で、自動化しましたので記事に起こします。

前提

なお、コンタクト承認をしてチャットワークIDの一覧を作成する作業はこちらで紹介しておりますので、ぜひご参照ください。

GASでチャットワークのコンタクト申請を自動承認しよう!

また、今回はアカウントIDがスプレッドシートに記載されていることを前提に説明していきます。

スプレッドシートを用意

まず、どのユーザーをグループに追加するのかの情報が必要なため、アカウントIDを取得していきます。
スプレッドシートを作成し、こちらの画像のようなヘッダーを用意していきましょう。

また、今回のプログラムではシート名は「ユーザー」で行っていきますので注意してください。

上記の「GASでチャットワークのコンタクト申請を自動承認しよう!」を試してくださった方は準備が完了しています。

本記事のプログラムではA列の「account_id」の入力は必須で、その他は空欄でも構いません。
アカウント情報の基礎情報としてヘッダーにしていますが、各自でカスタマイズ可能です。

スプレッドシートに紐づくApps Scriptを作成

スプレッドシート上部のタブから「拡張機能」を選択し、「Apps Script」をクリックしてください。
紐づくスクリプトが作成されるため、プロジェクト名を入力します。

Google Apps Scriptの導入方法についてはコチラで詳しく説明しています。ぜひご参照ください。

チャットワークAPIのトークンを取得する

今回もGoogle Apps Scriptによるチャットワークの利用を行います。

チャットワークのAPIのTOKENが必要になるため、下記を参考に取得しておいてください。

Chatwork APIの利用申請方法

ライブラリを追加する

GASで簡単にチャットワークのAPIを利用するためのライブラリを導入していきます。
使用するライブラリについてはこちらで紹介しています。

GAS × Chatwork APIのChatwork clientライブラリを解説

スクリプトIDは「1nf253qsOnZ-RcdcFu1Y2v4pGwTuuDxN5EbuvKEZprBWg764tjwA5fLav」です。

追加したいチャットワークのグループID(room_id)を取得する

追加したいグループのルームIDを取得していきます。

ブラウザからチャットワークを開いている場合はURL「https://www.chatwork.com/#!rid291996562」のうちの「!rid」からあとの数字列がルームIDになります。

下の添付画像でいうと「291996562」ですね。

または、グループチャット右上の歯車アイコンから「グループチャットの設定」にてルームIDを参照することができます。

初期設定をする

ではプログラムに落とし込んでいきましょう!
前提で取得したトークンや設定したスプレッドシートのシート名、
追加先のグループIDと追加する役割を設定します。

役割は

  • admin
  • member
  • readonly

の3つから選べます。

// チャットワーククライアント
const CLIENT = ChatWorkClient.factory({token: "487a9d52046a41700caaf791345213ec"})
// スプレッドシートを宣言
const SHEET = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ユーザー");
// 追加するグループID
const GROUP_ID = "291996562";
// グループ追加時の役割
const ROLE = "member";

スプレッドシートからユーザー情報を取得する

実行関数を作成し、ユーザーシートからヘッダー以外の全値を抽出します。

.getDataRange()は入力されている全範囲を検知します。
.getValues()は指定の範囲から2次元配列で値を取得します。
最後に.slice(1)で1行目を除外しています。

/**
 * 実行関数
 * グループ追加
 */
function run() {
  // ヘッダーの1行目を除いたすべてのデータを取得
  const USERS = SHEET.getDataRange().getValues().slice(1);

}

ユーザーをグループに追加する関数を作る

実行関数に以下を追加します。

取得したUSERSをforEach()にて1行ずつ取り出しています。
今回取り出した行のうち、0個目の値(つまりA列のaccount_id)をaddGropu()の関数に引数として指定しています。

/**
 * 実行関数
 * グループ追加
 */
function run() {
  // ヘッダーの1行目を除いたすべてのデータを取得
  const USERS = SHEET.getDataRange().getValues().slice(1);

  USERS.forEach(user => {
    // グループ追加
    addGroup(user[0]); // account_id
  });
}

addGroupではやることが主に3つのやることがあるため、それぞれ説明していきます。

/**
 * 指定のグループにユーザーを追加
 */
function addGroup(account_id) {
  // 既存メンバーを取得
  let group_members_obj = getGroupMembersObj();
  // 指定の役割に追加
  group_members_obj[ROLE].push(account_id);
  // メンバーを更新
  putGroupMembers(group_members_obj);
}

既存のグループメンバーを取得するAPIを叩く

グループメンバーを追加する際はチャットワークのAPIとしては「グループメンバーの変更」として処理しなくてはなりません。
そのため、既存メンバーの情報を取得した上で、プログラム上で新規メンバーを合わせてから変更とします。

まずはgetGroupMembersObj()にて既存のグループメンバーを取得する関数を呼び出しています。

/**
 * 対象のグループの既存メンバー情報を取得
 * return {権限: [IDs]}
 */
function getGroupMembersObj() {
  let end_point = "/rooms/" + GROUP_ID + "/members";
  let res = CLIENT.get(end_point)
  let obj = {
    "admin": [],
    "member": [],
    "readonly": [],
  };
  for(let i = 0; i < res.length; i++) {
    obj[res[i]["role"]].push(res[i]["account_id"]);
  }
  return obj;
}

グループメンバーを取得するAPIを叩き、res変数へと格納しています。
このとき、resに格納されるデータは下記のような値が入ります。

[
  {
    "account_id": 123,
    "role": "member",
    "name": "John Smith",
    "chatwork_id": "tarochatworkid",
    "organization_id": 101,
    "organization_name": "Hello Company",
    "department": "Marketing",
    "avatar_image_url": "https://example.com/abc.png"
  }
]

このresの配列を1つずつ取り出してrole(役割)ごとにオブジェクトに格納していきます。

指定の役割にユーザーを追加する

group_members_obj[ROLE].push(account_id);

ここでは指定の役割(今回は初期設定でmemberを指定しています。)に対して、スプレッドシートから取得していたaccount_idを追加します。
これにより、既存メンバーに追加して新規のユーザーを含めた情報となりました。

グループメンバーを更新するAPIを叩く

最後に新しいユーザーを含めた状態でグループを更新していきます。

putGroupMembers(group_members_obj);

こちらの関数は各役割ごとのメンバー情報をもとにAPIを叩いてグループメンバーを更新する関数となっています。

/**
 * グループのメンバーを変更
 */
function putGroupMembers(group_members_obj) {
  let end_point = "/rooms/" + GROUP_ID + "/members";
  let option = {};
  if(group_members_obj.admin.length > 0) {
    option["members_admin_ids"] = group_members_obj.admin.join(",");
  }
  if(group_members_obj.member.length > 0) {
    option["members_member_ids"] = group_members_obj.member.join(",");
  }
  if(group_members_obj.readonly.length > 0) {
    option["members_readonly_ids"] = group_members_obj.readonly.join(",");
  }
  let res = CLIENT.put(end_point, option)
  return res;
}

グループメンバーの変更は「/rooms/{group_room_id}/members」のエンドポイントを指定します。
また、put通信を行うため、CLIENT.put()となることに注意が必要です。

引数で受け取った値は新規ユーザーを追加した役割ごとのオブジェクトです。
チャットワークAPI側では「member_admin_ids」といったように少し送らなければならないkeyが異なっているため注意してください。

また、メンバーがゼロの役割も存在するため、各自しっかりとチェックを行っています。
受け取ったgroup_members_objでは各役割ごとに配列でデータが格納されていますが、チャットワークは「,」(カンマ)区切りのString型で受け取るようになっています。

そのため、join()を使ってカンマ区切りの文字列へと変換をしています。

 

これでグループメンバーの追加も自動で行うことができます。

コードまとめ

// チャットワーククライアント
const CLIENT = ChatWorkClient.factory({token: "487a9d52046a41700caaf791345213ec"})
// スプレッドシートを宣言
const SHEET = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ユーザー");
// 追加するグループID
const GROUP_ID = "291996562";
// グループ追加時の役割
const ROLE = "member";

/**
 * 実行関数
 * グループ追加
 */
function run() {
  // ヘッダーの1行目を除いたすべてのデータを取得
  const USERS = SHEET.getDataRange().getValues().slice(1);

  USERS.forEach(user => {
    // グループ追加
    addGroup(user[0]); // account_id
  });
}

/**
 * 指定のグループにユーザーを追加
 */
function addGroup(account_id) {
  // 既存メンバーを取得
  let group_members_obj = getGroupMembersObj();
  // 指定の役割に追加
  group_members_obj[ROLE].push(account_id);
  // メンバーを更新
  putGroupMembers(group_members_obj);
}


/**
 * 対象のグループの既存メンバー情報を取得
 * return {権限: [IDs]}
 */
function getGroupMembersObj() {
  let end_point = "/rooms/" + GROUP_ID + "/members";
  let res = CLIENT.get(end_point)
  let obj = {
    "admin": [],
    "member": [],
    "readonly": [],
  };
  for(let i = 0; i < res.length; i++) {
    obj[res[i]["role"]].push(res[i]["account_id"]);
  }
  return obj;
}

/**
 * グループのメンバーを変更
 */
function putGroupMembers(group_members_obj) {
  let end_point = "/rooms/" + GROUP_ID + "/members";
  let option = {};
  if(group_members_obj.admin.length > 0) {
    option["members_admin_ids"] = group_members_obj.admin.join(",");
  }
  if(group_members_obj.member.length > 0) {
    option["members_member_ids"] = group_members_obj.member.join(",");
  }
  if(group_members_obj.readonly.length > 0) {
    option["members_readonly_ids"] = group_members_obj.readonly.join(",");
  }
  let res = CLIENT.put(end_point, option)
  return res;
}

実行する際の承認方法についてはコチラを参照ください。

まとめ

いかがでしょうか?

グループメンバーの自動追加は一度、既存メンバーの取得をしてからデータを加工しなくてはならないため、少々面倒な作業が必要になります。

しかし、本記事にあるやり方で役割をしっかりと区別し、指定の役割に追加することで自動でのグループ追加も簡単になります。
本記事のプログラムを参考にすることでグループの追加や変更のカスタマイズも簡単にできることになるでしょう。

ぜひ、チャレンジして業務を効率化してみてくださいね!

Google Workspaceを活用している場合はGoogle Apps Scriptを覚えると業務の効率化および自動化ができます。
Google Apps Scriptが学べるスクールはコチラで紹介しています。よかったら見てみてください。

Google Apps Scriptを学べるスクール3選

Google Apps Scriptが学べたらコチラの記事で収益化してみてはいかがでしょうか?

Google Apps Scriptのプロが教える!成功するGAS副業完全ガイド

以上、最後までお読みいただきありがとうございます。

最新情報をチェックしよう!