クラスしたい

以下のサンプルコードでやっていることは同じなので、自分が書きやすいほうで書けばよいです。

実行したい内容

Slack APIを使ってワークスペースに参加しているメンバーのリストと 作成済みのチャンネルのリストを取得します。

1function testRun() {
2    const API_TOKEN = "xxxxxxxxxx"
3    const sa = new SlackAccessor(API_TOKEN);
4    const members = sa.requestMembers();
5    const channels = sa.requestChannels();
6    // (省略)取得したデータをSpreadsheetに書き込む処理
7}

classを使った方法

 1class SlackAccessor {
 2    constructor(apiToken) {
 3        this.apiToken = apiToken;
 4    }
 5
 6    requestAPI(path, params) {
 7        // (省略)API取得に必要な情報(URLなど)を作成する処理
 8        // const url = ...
 9        // const options = ...
10        const response = UrlFetchApp.fetch(url, options)
11        const data = JSON.parse(response.getContentText());
12        return data;
13    };
14
15    requestMemberList() {
16        const response = this.requestAPI("users.list");
17        return response.members;
18    }
19
20    requestChannels() {
21        const response = this.requestAPI("conversations.list");
22        return response.channels;
23    }
24}

classでクラスを定義できます。 constructorはクラスのインスタンスを初期化するときに呼ばれる関数です。 これがないとエラーになります。

この場合のthisはPythonのselfのような役割を持ちます。 ただし、JavaScriptのthisは、呼び出された場所によって参照している対象が異なることがあるので注意が必要です。

prototypeを使った方法

もともとJavaScriptには「クラス」を作る機能がなく、 prototypeという機能を使って「クラスのような」実装をしていたみたいです。 これから新しく作成するスクリプトでは、この書き方を真似する必要はないと思われます。

 1var SlackAccessor = (function () {
 2    function SlackAccessor(apiToken) {
 3        this.APIToken = apiToken;
 4    }
 5
 6    var p = SlackAccessor.prototype;
 7
 8    // API リクエスト
 9    p.requestAPI = function (path, params) {
10        // (省略)API用のURLとオプションを作成する
11        var response = UrlFetchApp.fetch(url, options);
12        var data = JSON.parse(response.getContentText());
13        return data;
14    };
15
16    // メンバーリスト取得
17    p.requestMembers = function () {
18        var response = this.requestAPI('users.list');
19        return response.members;
20    });
21
22    // チャンネル情報取得
23    p.requestChannels = function () {
24    var response = this.requestAPI('conversations.list');
25    return response.channels;
26    };
27);