【GAS】googleフォームの回答を元にChatWorkのルームを作成する


やりたかったこと

タイトルのまんまです。

なぜ作ろうと思ったか

会社でChatWorkを使っていてどんどんルームが作成されるのはいいけどルームの命名規則等が無く見づらかった。
規則を作れば良いんだけど守らない人も出てくると思ったので、googleフォームから作ってもらえば制限もかけれそうだしいいんじゃないかと思って。

流れ

1.googleフォームに作成したいルームの情報を入力し回答
2.google apps scriptで回答内容を元にchatworkへルーム作成のリクエストを投げる
3.ChatWorkにルームが作成される

さっそく作ってみる

0.事前確認

ドキュメントを読んだらルームの作成に必須な情報は以下の通り。
・members_admin_ids(管理者権限のユーザー)
 - 参加メンバーのうち管理者権限にしたいユーザーアカウントのID。複数指定可
・name(グループチャット名)

必須ではない項目は以下の通り
・description(チャット概要)
・icon_preset(グループチャットのアイコン種類)
・link(招待リンク作成)
 - 招待リンクを作成するかどうか。
・link_code(リンクの文字列)
・link_need_acceptance(承認要否)
・members_member_ids(メンバー権限のユーザー)
・members_readonly_ids(閲覧のみ権限のユーザー)

会社では作成したルームへのユーザー追加はチーム機能を利用しているが、用意されていなかったのでルーム作成後に手動でチーム追加してもらう運用を想定。

とりあえず↓の4つだけで実装してみる
・members_admin_ids(管理者権限のユーザー)
・name(グループチャット名)
・description(チャット概要)
・icon_preset(グループチャットのアイコン種類)

1.googleフォームの準備

とりあえずシンプルなフォームを作成。
お客さんの名前を入力してもらうものと、作成者(担当者)の名前を選択してもらう質問を作成。

2.google apps scriptで回答内容を元にchatworkへルーム作成のリクエストを投げる

管理者権限のユーザーIDが必要なので名前とIDを管理するスプレッドシートを作成。
フォームで作成者に入力された人を管理者にする。

sample.gas
function createChatRoom(e) {
  const formdata = e.response.getItemResponses();
  let companyName;
  let createUser;
  for (let i = 0; i < formdata.length; i++) {
    if (formdata[i].getItem().getTitle() === '顧客名') {
      companyName = formdata[i].getResponse();
    } else if (formdata[i].getItem().getTitle() === '作成者') {
      createUser = formdata[i].getResponse();
    }
  }
  const userCwId = getUserInfo(createUser); //スプレッドシートからフォーム回答者のChatWorkIDを取得する関数を実行
  const token = PropertiesService.getScriptProperties().getProperty('CW_TOKEN')
  const headers = {
    'X-ChatWorkToken': token
  };
  const payload = {
    'description': '概要だよ',
    'icon_preset': 'star',
    'members_admin_ids': `${userCwId}, 複数の場合はカンマ区切りで指定`,
    'name': `【A会社】${companyName}様`
  };
  const options = {
    'headers': headers,
    'method': 'post',
    'payload': payload,
  };

  const url = 'https://api.chatwork.com/v2/rooms';
  const res = UrlFetchApp.fetch(url, options);
  console.log(res.getContentText())
  console.log(res.getResponseCode())
}

function getUserInfo(name) {
  const userInfoSpreadsheet = SpreadsheetApp.openById('ID情報を管理してるスプレッドシートのID');
  const userInfoSheet = userInfoSpreadsheet.getSheets()[0];
  const names = userInfoSheet.getRange(1, 1, userInfoSheet.getLastRow()).getValues().flat();
  const userRowNum = names.indexOf(name) + 1;
  const userCwId = userInfoSheet.getRange('B' + userRowNum).getValue();
  return userCwId;
}

3.ChatWorkにルームが作成される

できた。

実際に使うかは置いといてとりあえず動いたのでよし。
あとはフォームの構成をどうしようか考えよう。