teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

5

2022/01/06 12:59

投稿

退会済みユーザー
answer CHANGED
@@ -99,4 +99,8 @@
99
99
  - postToSlack(message);
100
100
 
101
101
  }
102
+
103
+ function postToSlack(message) {
104
+ ...略...
105
+ }
102
106
  ```

4

2022/01/06 12:59

投稿

退会済みユーザー
answer CHANGED
@@ -39,26 +39,8 @@
39
39
   書き込んでいるGASを使って最終的なSlackの投稿処理まで行う、ということです)
40
40
 
41
41
  具体的には、書き込み用のGASでD列にメールアドレスを書き込んだ後、続けて数式が入っているセル(E列~I列まで)を読み取ってSlackに投稿する、という流れです。
42
- たとえば現状、書き込み用GASが下のようなっていると仮定ます。
42
+ 以下のように**スプレッドシートのA列~D列に書き込む処理、Slack投稿用のコードを継ぎ足しみてはかがでょうか**?
43
- ```
44
- function writeMailAddress() {
45
43
 
46
- const ss = SpreadsheetApp.openById("書き込み先のスプレッドシートID");
47
- const sh = ss.getSheetByName("errordata_gmail");
48
-
49
- // 書き込むメールアドレス
50
- const mailAddress = "aa@aaa.com";
51
-
52
- // 書き込み先の行番号(ここでは簡便のため固定値(10)にしているが、forループを使っている場合はその変数に読み替えてもよい)
53
- const writeRow = 10;
54
-
55
- // メールアドレスを「writeRow行目、D列」に書き込む
56
- sh.getRange(writeRow, 4).setValue(mailAddress);
57
- }
58
- ```
59
-
60
- これを使ってSlackに投稿したいなら、以下のように、**上記の続きに、Slack投稿用のコードを継ぎ足してみてはいかがでしょうか**?
61
-
62
44
  (先頭が「+」となっている行は追加、「-」となっている行は削除)
63
45
  ```diff
64
46
  //送付エラーのタイムスタンプ/件名/本文/メールIDをスプレッドシートに吐き出す

3

修正

2022/01/06 12:57

投稿

退会済みユーザー
answer CHANGED
@@ -59,50 +59,62 @@
59
59
 
60
60
  これを使ってSlackに投稿したいなら、以下のように、**上記の続きに、Slack投稿用のコードを継ぎ足してみてはいかがでしょうか**?
61
61
 
62
+ (先頭が「+」となっている行は追加、「-」となっている行は削除)
62
- ```
63
+ ```diff
63
- function writeMailAddress() {
64
+ //送付エラーのタイムスタンプ/件名/本文/メールIDをスプレッドシートに吐き出す
64
65
 
66
+ function getGmailToSS() {
65
- const ss = SpreadsheetApp.openById("書き込み先のスプレッドシートID");
67
+ const ss = SpreadsheetApp.getActiveSpreadsheet();
66
- const sh = ss.getSheetByName("errordata_gmail");
68
+ const sheet = ss.getSheetByName('errordata_gmail');
67
69
 
68
- // 書き込むメールアドレス
69
- const mailAddress = "aa@aaa.com";
70
+ const searchlabel = '"送付エラー"';
70
71
 
71
- // 書き込先の行番号(ここでは簡便のため固定値(10)にしているが、forループを使っている場合はその変数に読み替えてもよい)
72
+ const threads = GmailApp.search('label:(' + searchlabel + ') -label:処理済');
72
- const writeRow = 10;
73
73
 
74
- // メールアドレスを「writeRow行目、D列」に書き込む
75
- sh.getRange(writeRow, 4).setValue(mailAddress);
74
+ const msgIdArray = sheet.getRange("D:D").getValues().filter(String).flat();
75
+ let lastRow = msgIdArray.length + 1;
76
76
 
77
+ for (const n in threads) {
78
+ const thread = threads[n];
77
- /**************以下 追加部分*****************/
79
+ const msgs = thread.getMessages();
80
+ msgs
78
81
 
79
- // スプレッドシートから必要なデータを読み取り、スラックに投稿する。
82
+ for (m in msgs) {
80
- const staffErrorEmail = sh.getRange(writeRow, 5).getValue(); //5=E列(送付エラーアドレス)
81
- const staffName = sh.getRange(writeRow, 6).getValue(); //6=F列(スタッフ名)
83
+ const msg = msgs[m];
82
- const temphireId = sh.getRange(writeRow, 7).getValue(); //7=G列(ID)
84
+ const id = msg.getId();
83
- const slackId = sh.getRange(writeRow, 9).getValue(); //9=I列(SlackID)
84
85
 
85
- const message = slackId + '\n' + staffName + '\n' + staffErrorEmail + temphireId;
86
+ if (msgIdArray.includes(id)) continue; //IDがD列に既に存在する場合はスルー
86
- postToSlack(message);
87
87
 
88
- }
89
88
 
89
+ const msgData = [[msg.getDate(), msg.getSubject(), msg.getPlainBody(), id]];
90
+ sheet.getRange(lastRow, 1, 1, 4).setValues(msgData); //まとめて書き込み
90
91
 
91
- function postToSlack(message) {
92
- const postToMDS = "通知先のWebhooksURL";
93
- const jsonData = {
94
- "text": message,
95
- };
96
92
 
93
+ + // スプレッドシートから必要なデータを読み取り、スラックに投稿する。
94
+ + const staffErrorEmail = sheet.getRange(lastRow, 5).getValue(); //5=E列(送付エラーアドレス)
95
+ + const staffName = sheet.getRange(lastRow, 6).getValue(); //6=F列(スタッフ名)
96
+ + const temphireId = sheet.getRange(lastRow, 7).getValue(); //7=G列(ID)
97
+ + const slackId = sheet.getRange(lastRow, 9).getValue(); //9=I列(SlackID)
98
+ + const message = slackId + '\n' + staffName + '\n' + staffErrorEmail + temphireId;
97
- const payload = JSON.stringify(jsonData);
99
+ + postToSlack(message);
98
100
 
99
- const options = {
101
+ lastRow++
100
- "method": "post",
101
- "contentType": "application/json",
102
- "payload": payload,
103
- };
102
+ }
104
103
 
104
+
105
+ const label = GmailApp.getUserLabelByName('処理済み');
106
+ thread.addLabel(label);
107
+ }
108
+
109
+
105
- // リクエスト
110
+ - // スプレッドシーから必要なデータを読み取り、スラックに投稿する。
111
+ - const staffErrorEmail = sh.getRange(writeRow, 5).getValue(); //5=E列(送付エラーアドレス)
112
+ - const staffName = sh.getRange(writeRow, 6).getValue(); //6=F列(スタッフ名)
113
+ - const temphireId = sh.getRange(writeRow, 7).getValue(); //7=G列(ID)
114
+ - const slackId = sh.getRange(writeRow, 9).getValue(); //9=I列(SlackID)
115
+
116
+ - const message = slackId + '\n' + staffName + '\n' + staffErrorEmail + temphireId;
106
- UrlFetchApp.fetch(postToMDS, options);
117
+ - postToSlack(message);
118
+
107
119
  }
108
120
  ```

2

2022/01/06 12:55

投稿

退会済みユーザー
answer CHANGED
@@ -5,7 +5,7 @@
5
5
  ただし、たとえば、GoogleスプレッドシートのAppSheetという機能による書き込みについては、「変更時」トリガーであれば書き込みがあったことを検知し、書き込まれたセルがActiveCellになるということは確認できています。(「編集時」トリガーでは検知不可)
6
6
  したがって、限られた場面では、スプレッドシートへ直接手動入力する場合以外であっても「変更」トリガーで検知できる可能性はあるかもしれません。
7
7
 
8
- コメントでの質問に対する回答によると、今回I列への文字入力は「手動入力ではない」とのことですが、どのよう自動入力されるのか詳細が開示されておりませんので、質問者さんの使用状況で「変更時」でも検知できるかどうかはこちらではわかりかねます。
8
+ コメントでの質問に対する回答によると、今回I列への文字入力は「手動入力ではない」とのことですが、どのような手段を用いて自動入力しているのかにつての詳細が開示されておりませんので、質問者さんの使用状況で「変更時」でも検知できるかどうかはこちらではわかりかねます。
9
9
 
10
10
  いずれにしても下記コードに直したうえで、トリガーを「編集時」から「変更時」に変更して保存した場合、もしかしたら検知できるかもしれません。
11
11
  ```js

1

追記

2021/12/28 11:07

投稿

退会済みユーザー
answer CHANGED
@@ -5,7 +5,7 @@
5
5
  ただし、たとえば、GoogleスプレッドシートのAppSheetという機能による書き込みについては、「変更時」トリガーであれば書き込みがあったことを検知し、書き込まれたセルがActiveCellになるということは確認できています。(「編集時」トリガーでは検知不可)
6
6
  したがって、限られた場面では、スプレッドシートへ直接手動入力する場合以外であっても「変更」トリガーで検知できる可能性はあるかもしれません。
7
7
 
8
- コメントでの質問に対する回答によると、今回I列への文字入力は「手動入力ではない」とのことですが、どのように自動入力されるのかという詳細が開示されておりませんので、質問者さんの使用状況で「変更時」でも検知できるかどうかはこちらではわかりかねます。
8
+ コメントでの質問に対する回答によると、今回I列への文字入力は「手動入力ではない」とのことですが、どのように自動入力されるのかという詳細が開示されておりませんので、質問者さんの使用状況で「変更時」でも検知できるかどうかはこちらではわかりかねます。
9
9
 
10
10
  いずれにしても下記コードに直したうえで、トリガーを「編集時」から「変更時」に変更して保存した場合、もしかしたら検知できるかもしれません。
11
11
  ```js
@@ -28,6 +28,81 @@
28
28
 
29
29
  const message = slackId + '\n' + staffName + '\n' + staffErrorEmail + temphireId ;
30
30
  postToSlack(message);
31
+ ```
31
32
 
33
+ --------
32
34
 
35
+ # コメントを受けて追記
36
+ 「GASを使ってD列にメールアドレスを書き込んでいる」とのことなので、
37
+ アプローチを変えて、その**書き込むGASの方を改造**すればよいと思います。
38
+ (書き込まれるスプレッドシートの方で書き込まれたことを検知するのではなく、
39
+  書き込んでいるGASを使って最終的なSlackの投稿処理まで行う、ということです)
40
+
41
+ 具体的には、書き込み用のGASでD列にメールアドレスを書き込んだ後、続けて数式が入っているセル(E列~I列まで)を読み取ってSlackに投稿する、という流れです。
42
+ たとえば、現状、書き込み用のGASが下のようになっていると仮定します。
43
+ ```
44
+ function writeMailAddress() {
45
+
46
+ const ss = SpreadsheetApp.openById("書き込み先のスプレッドシートID");
47
+ const sh = ss.getSheetByName("errordata_gmail");
48
+
49
+ // 書き込むメールアドレス
50
+ const mailAddress = "aa@aaa.com";
51
+
52
+ // 書き込み先の行番号(ここでは簡便のため固定値(10)にしているが、forループを使っている場合はその変数に読み替えてもよい)
53
+ const writeRow = 10;
54
+
55
+ // メールアドレスを「writeRow行目、D列」に書き込む
56
+ sh.getRange(writeRow, 4).setValue(mailAddress);
57
+ }
58
+ ```
59
+
60
+ これを使ってSlackに投稿したいなら、以下のように、**上記の続きに、Slack投稿用のコードを継ぎ足してみてはいかがでしょうか**?
61
+
62
+ ```
63
+ function writeMailAddress() {
64
+
65
+ const ss = SpreadsheetApp.openById("書き込み先のスプレッドシートID");
66
+ const sh = ss.getSheetByName("errordata_gmail");
67
+
68
+ // 書き込むメールアドレス
69
+ const mailAddress = "aa@aaa.com";
70
+
71
+ // 書き込み先の行番号(ここでは簡便のため固定値(10)にしているが、forループを使っている場合はその変数に読み替えてもよい)
72
+ const writeRow = 10;
73
+
74
+ // メールアドレスを「writeRow行目、D列」に書き込む
75
+ sh.getRange(writeRow, 4).setValue(mailAddress);
76
+
77
+ /**************以下 追加部分*****************/
78
+
79
+ // スプレッドシートから必要なデータを読み取り、スラックに投稿する。
80
+ const staffErrorEmail = sh.getRange(writeRow, 5).getValue(); //5=E列(送付エラーアドレス)
81
+ const staffName = sh.getRange(writeRow, 6).getValue(); //6=F列(スタッフ名)
82
+ const temphireId = sh.getRange(writeRow, 7).getValue(); //7=G列(ID)
83
+ const slackId = sh.getRange(writeRow, 9).getValue(); //9=I列(SlackID)
84
+
85
+ const message = slackId + '\n' + staffName + '\n' + staffErrorEmail + temphireId;
86
+ postToSlack(message);
87
+
88
+ }
89
+
90
+
91
+ function postToSlack(message) {
92
+ const postToMDS = "通知先のWebhooksURL";
93
+ const jsonData = {
94
+ "text": message,
95
+ };
96
+
97
+ const payload = JSON.stringify(jsonData);
98
+
99
+ const options = {
100
+ "method": "post",
101
+ "contentType": "application/json",
102
+ "payload": payload,
103
+ };
104
+
105
+ // リクエスト
106
+ UrlFetchApp.fetch(postToMDS, options);
107
+ }
33
108
  ```