回答編集履歴

3

解説

2022/11/08 09:24

投稿

Cocode
Cocode

スコア2314

test CHANGED
@@ -66,3 +66,43 @@
66
66
  }
67
67
  ```
68
68
  ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-11-08/9fa74fc5-b0e3-4a52-a80d-140d4e48f741.png)
69
+
70
+ ### C列やD列が何番目か
71
+ `const uncompletedTasks = range.getValues()` ←ここまでで全データが格納された2次元配列を生成しています。
72
+ ```javascript
73
+ [
74
+ [ '<@ABCDEFGHI>', 'Clean the bath room', 'done' ],
75
+ [ '@Cocode', 'Take the garbage out', '' ],
76
+ [ '<@ABCDEFGHI>', 'Buy bananas', 'done' ],
77
+ [ '<@ABCDEFGHI>', 'Send email', '' ]
78
+ ]
79
+ ```
80
+ `[ '<@ABCDEFGHI>', 'Clean the bath room', 'done' ]`を例に見るとインデックス2番目の要素がC列です。
81
+ D列が存在する場合はインデックス3番目になるので、`task[3]`であっています。
82
+
83
+ 私のコードの例の場合、取得してきた全データの中から、C列が空欄なものだけを`.filter()`で絞っています。
84
+
85
+ ### 分割代入について
86
+ また分割代入という手法を使ってそれぞれの値を一括して変数に代入してやることができます。
87
+
88
+ 例)
89
+ ```javascript
90
+ const data = ['寺テイル', 30, 'male'];
91
+ const [name, age, gender] = data;
92
+ console.log(name); // '寺テイル'
93
+ console.log(age); // 30
94
+ console.log(gender); // 'male' が代入される
95
+ ```
96
+ こんな感じです!
97
+
98
+ つまり、
99
+ ```javascript
100
+ // ↓の部分は、
101
+ const [slackUserId, todo] = task;
102
+
103
+ // ↓例えばこうなってる
104
+ const [slackUserId, todo] = [ '<@ABCDEFGHI>', 'Send email', '' ];
105
+ console.log(slackUserId); // '<@ABCDEFGHI>'
106
+ console.log(todo); // 'Send email'
107
+ // あまった '' は無視。どこにも代入されていない。
108
+ ```

2

tyぽ

2022/11/07 18:20

投稿

Cocode
Cocode

スコア2314

test CHANGED
@@ -18,6 +18,7 @@
18
18
  ```javascript
19
19
  // 🚫 ただの文字になってしまうダメな例
20
20
  @Cocode
21
+ @ABCDEFGHI
21
22
 
22
23
  // ✅ 正しいメンション方法
23
24
  <@ABCDEFGHI>

1

メンション

2022/11/07 17:06

投稿

Cocode
Cocode

スコア2314

test CHANGED
@@ -11,3 +11,57 @@
11
11
  ```
12
12
 
13
13
  どちらかというと`.getValues()`の方が間違ってそうに見えるんですが…でもそちらの方は正常に動いてるんですよね?
14
+
15
+ ### GASからSlackのメンションをつける方法
16
+ GASでSlackのメンションをつけるためには、`<@メンバーID>`と書かないといけないらしいです。
17
+
18
+ ```javascript
19
+ // 🚫 ただの文字になってしまうダメな例
20
+ @Cocode
21
+
22
+ // ✅ 正しいメンション方法
23
+ <@ABCDEFGHI>
24
+ ```
25
+
26
+ ##### SlackメンバーIDの調べ方
27
+ 1. IDを調べたいメンバーのアイコンをクリック
28
+ 2. [...その他]というアイコンをクリック
29
+ 3. 出てきたメニューのなかにある[メンバーIDをコピー]をクリック
30
+ 4. ペーストすると、`ABCDEFGHI`のような文字列がでてくるので、<@ABCDEFGHI>とスプレッドシートに直接書いてしまったらいいと思います。
31
+
32
+ ↓こんな感じ
33
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-11-08/a0a08e40-ee03-4362-93a2-f9ca5b42e353.png)
34
+
35
+ ### おまけのコード
36
+ ↑のスクショの「Status」の列が空欄の行のみ、Slackで通知を送るようなコードをかきました。
37
+ ポイントとしては、GASとの通信回数を減らしているので処理が多少速いはずです。
38
+
39
+ ```javascript
40
+ const SLACK_WEBHOOK_URL = '*****Webhook URLをここに入力*****';
41
+
42
+ function notifyUncompletedTaskToSlack() {
43
+ const sheet = SpreadsheetApp.getActiveSheet();
44
+ const range = sheet.getRange(2, 1, sheet.getLastRow()-1, sheet.getLastColumn());
45
+ const uncompletedTasks = range.getValues().filter(task => task[2].trim() === '');
46
+
47
+ for (const task of uncompletedTasks) {
48
+ const [slackUserId, todo] = task;
49
+ let msg = slackUserId + '\n';
50
+ msg += todo;
51
+
52
+ postSlack_(msg);
53
+ }
54
+ }
55
+
56
+ function postSlack_(message) {
57
+ const params = {
58
+ 'method': 'POST',
59
+ 'contentType': 'application/json',
60
+ 'payload': JSON.stringify({'text': message})
61
+ };
62
+
63
+ const responce = UrlFetchApp.fetch(SLACK_WEBHOOK_URL, params);
64
+ Logger.log(responce);
65
+ }
66
+ ```
67
+ ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-11-08/9fa74fc5-b0e3-4a52-a80d-140d4e48f741.png)