クラスしたい
以下のサンプルコードでやっていることは同じなので、自分が書きやすいほうで書けばよいです。
実行したい内容
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);