見出し画像

[GAS] Chatworkのチャット一覧を取得し、Googleスプレッドシートに出力する

はじめに

以前、GASでChatworkで複数のルームに一斉にメッセージを送信するツールを作成しました。

送信先のグループチャットのルームIDを設定する場合、ルームIDを確認するのに、Chatworkアプリを開いて、対象のルームに移動して確認する、という作業をしていました。
この方法だと、数が多いと、時間が掛かってしまうため、事前にチャット一覧を、Googleスプレッドシートに出力しておきたいと思います。

今回は、GASでChatwork API を使って、チャット一覧を取得し、Googleスプレッドシートに出力する処理についてまとめます。

事前準備

1.Chatwork APIトークンの発行

Chatwork APIを使用するには、APIトークンを発行しておく必要があります。
APIトークンを発行する
この手順で取得したAPIトークンを、メモっておきます。

2.Chatwork APIトークンを、スクリプトプロパティに設定

Apps Scriptエディタから、「プロジェクトの設定」ボタンをクリックします。

「プロジェクトの設定」ボタンをクリック

「スクリプトプロパティ」の欄の「スクリプトプロパティを追加」ボタンをクリックします。

「スクリプトプロパティを追加」ボタンをクリック

「プロパティ」に、コード内で参照するキーの名前を設定します。
今回は、①「CW_TOKEN」としてプロパティに設定しました。
②「値」には、先ほどChatworkから取得したAPIトークンを設定して、③「スクリプトプロパティを保存」をクリックします。

スクリプトプロパティの設定

コードの中で、「プロパティ」に設定したキーを指定することで、APIトークンが取得できるようになります。

実装

全体の実装は下記です。

function myFunction() {
  const props = PropertiesService.getScriptProperties();
  const token = props.getProperty('CW_TOKEN');

  const res = getContacts_(token);
  const json = JSON.parse(res.getContentText());

  const header = Object.keys(json[0]);

  const values = [];
  for ( const room of json ){
    values.push(Object.values(room));
  }
  values.unshift(header);

  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('チャット一覧');
  sheet.getRange(1, 1, values.length, values[0].length).setValues(valueus);
}

/**
 * ChatworkAPIより、チャット一覧を取得する
 *
 * @param {string} token - ChatworkAPIトークン
 * @return {Object} HTTPResponseオブジェクト 
 *
 */
function getRooms_(token) {
  const params = getParam_(token, 'GET');
  const url = "https://api.chatwork.com/v2/rooms/";
  return UrlFetchApp.fetch(url, params);
}

/**
 * HTTPリクエストのパラメータを取得する
 *
 * @param {string} token - ChatworkAPIトークン
 * @param {string} method - HTTPメソッド
 * @param {object} payload - リクエスト
 * @return {Object} HTTPリクエストのパラメータ 
 *
 */
function getParam_(token, method) {
    const params = {
      method: method,
      headers: {
        'X-ChatWorkToken': token
      },
    };
    return params;
}

処理を順に説明します。

スクリプトプロパティからAPIトークンを取得する

事前準備でスクリプトプロパティに保存したAPIトークンを取得します。

  const props = PropertiesService.getScriptProperties();
  const token = props.getProperty('CW_TOKEN');

Chatwork APIから、チャット一覧を取得する

チャット一覧を取得する処理は、getRooms_関数にまとめています。

function getRooms_(token) {
  const params = getParam_(token, 'GET');
  const url = "<https://api.chatwork.com/v2/rooms/>";
  return UrlFetchApp.fetch(url, params);
}

チャット一覧を取得するChatwork APIのリファレンスは、下記です。

UrlFetchAppサービスのfetchメソッドに、上記リファレンスのURLと、パラメータを設定しています。
パラメータを作成する処理は、getParam_関数にまとめています。
パラメータのHTTPリクエストヘッダに、APIトークンを、X-ChatWorkTokenというキーで値を設定します。

function getParam_(token, method) {
    const params = {
      method: method,
      headers: {
        'X-ChatWorkToken': token
      },
    };
    return params;
}

レスポンスを受け取る

Chatwork APIのレスポンスはJSON形式となっています。
fetchメソッドの戻り値として取得したHTTPResponseオブジェクトのgetContentTextメソッドを使って、HTTPレスポンスを文字列として取得します。
その文字列を、JSONオブジェクトのparseメソッドを使って、オブジェクトに変換します。

const json = JSON.parse(res.getContentText());

スプレッドシートに書き出すために2次元配列に変換する

取得したJSONデータは、オブジェクトの配列で格納されています。
配列の要素は、チャット情報がオブジェクトとして格納されています。

JSONデータ

チャット情報のオブジェクトのキーを、見出し行として使用します。
Objectクラスのkeysメソッドを使用して、オブジェクトのキーを配列として取得し、見出し行を作成します。

const header = Object.keys(json[0]);

header変数を標準出力に表示すると、チャット情報のオブジェクトのキーが取得できているのが確認できました。

チャット情報のオブジェクトのキーを配列に変換

続いて、配列で格納されているチャット情報のオブジェクトから、値のみを配列として取得するのに、Objectクラスのvaluesメソッドを使用します。

  const values = [];
  for ( const room of json ){
    values.push(Object.values(room));
  }

チャット情報のオブジェクトの「値」を、配列として取得します。

先ほど取得した見出し行を、スプレッドシートに書き出す配列の先頭に追加します。

values.unshift(header);

Googleスプレッドシートに書き出します。

  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('チャット一覧');
  sheet.getRange(1, 1, values.length, values[0].length).setValues(values);

実行した結果は、下記です。見出し行には、チャット情報のオブジェクトのキーが、2行目以降はチャット情報のオブジェクトの値が出力されています!

出力結果

まとめ

今回は、GASでChatwork API を使って、チャット一覧を取得し、Googleスプレッドシートに出力する実装についてまとめました。

参考サイト

HTTPレスポンスのJSON形式のデータを、オブジェクトの「キー」と「値」を取得する方法は、こちらの記事を参考にしました。ありがとうございました!


この記事が気に入ったらサポートをしてみませんか?