回答編集履歴

1

a

2020/03/25 13:53

投稿

papinianus
papinianus

スコア12705

test CHANGED
@@ -1,229 +1,129 @@
1
- ### 前提・実現したいこと
1
+ ```javascript
2
2
 
3
- [こちら](https://tonari-it.com/gas-workflow-form-gmail-spreadsheet/)を参照して、Googleフォームで「出張承認申請」のワークフローを作成しています。
3
+ const generateMessageBody = (val) => {
4
4
 
5
- 作成したワークフロー自体は動くのですが、以下機能を追加する方法が分からず、質問させてください。
5
+ return {
6
6
 
7
- Googleフォーム内に質問「承認する上長」回答「各部署の上長の名前」を設け、
7
+ plain: fillin(val).map(e => `${e}`).join("\n"),
8
8
 
9
- 質問の回答(各上長の名前)ごとに、各上長のメールアドレスに通知が行くようにしたいです。
9
+ html: `<ul><li>${fillin(val).map(e => `・${e}`).join("</li><li>")}</li></li>`
10
10
 
11
- ### 該当のソースコード
11
+ }
12
12
 
13
- ```
13
+ };
14
14
 
15
- function generateBodies(values){
15
+ const fillin = (val) => {
16
16
 
17
- var name = values[1];
17
+ const items = ["お名前: ","出張先: ","出張目的: ","出張開始日: ","出張終了日: ","プライベート経路: ","回数券使用枚数: ","回数券使用枚数: ","承認する上長: "];
18
18
 
19
- var destination = values[2];
20
-
21
- var purpose = values[3];
22
-
23
- var startdate = values[4];
24
-
25
- var enddate = values[5];
26
-
27
- var private = values[6];
28
-
29
- var ticket = values[7];
30
-
31
- var boss = values[8];
32
-
33
-
34
-
35
- var plain = '';
36
-
37
- plain += '・お名前: ' + name + '\n';
38
-
39
- plain += '・出張先: ' + destination + '\n';
40
-
41
- plain += '・出張目的: ' + purpose + ' \n';
42
-
43
- plain += '・出張開始日: ' + startdate + '\n';
44
-
45
- plain += '・出張終了日: ' + enddate + ' \n\n';
46
-
47
- plain += '・プライベート経路: ' + private + '\n';
48
-
49
- plain += '・回数券使用枚数: ' + ticket + '\n';
50
-
51
- plain += '・承認する上長: ' + boss + '\n';
52
-
53
- var html = '<ul>';
19
+ return items.map((e,i)=>`${e}${val[i]}`);
54
-
55
- html += '<li>お名前: ' + name + '</li>';
56
-
57
- html += '<li>出張先: ' + destination + '</li>';
58
-
59
- html += '<li>出張目的: ' + purpose + '</li>';
60
-
61
- html += '<li>出張開始日: ' + startdate + '</li>';
62
-
63
- html += '<li>出張終了日: ' + enddate + '</li>';
64
-
65
- html += '<li>プライベート経路: ' + private + '</li>';
66
-
67
- html += '<li>回数券使用枚数: ' + ticket + '</li>';
68
-
69
- html += '<li>承認する上長: ' + boss + '</li>';
70
-
71
- html += '</ul>';
72
-
73
-
74
-
75
- return {
76
-
77
- plain: plain,
78
-
79
- html: html
80
-
81
- };
82
20
 
83
21
  }
84
22
 
85
- function sendMessage(e) {
23
+ const getMailAddr = (name) => {
86
24
 
87
-
25
+ const list = {
88
26
 
89
- var row = e.range.getRow();
27
+ "質問者":"root@example.com",
90
28
 
91
- var sheet = e.range.getSheet();
29
+ "管理者":"admin@example.com",
92
30
 
93
- sheet.getRange(row, 11).setValue('確認中');
31
+ }
94
32
 
95
- var bodies = generateBodies(e.values);
96
-
97
-
98
-
99
- var url = 'https://script.google.com/~~~~~/exec'; //公開したウェブアプリケーションのURL
100
-
101
- url += '?row=' + row + '&answer=';
33
+ return list[name] || "root@example.com"
102
-
103
-
104
-
105
- var recipient = 'xxxx@xxxx.xxx'; //送信先メールアドレス
106
-
107
- var subject = '出張承認申請のお知らせ';
108
-
109
-
110
-
111
- var body = '';
112
-
113
- body += '以下の出張承認申請がありました。\n\n';
114
-
115
- body += bodies.plain;
116
-
117
- body += '承認する場合は、以下URLをクリックしてください\n';
118
-
119
- body += url + 'ok';
120
-
121
- body += '否認する場合は、以下URLをクリックしてください\n';
122
-
123
- body += url + 'ng';
124
-
125
-
126
-
127
- var html = '';
128
-
129
- html += '<h1>出張承認申請のお知らせ</h1>';
130
-
131
- html += '<p>以下の出張承認申請がありました。</p>';
132
-
133
- html += bodies.html;
134
-
135
- html += '<p>承認する場合は、<a href="' + url + 'ok">[承認]</a>をクリックしてください</p>';
136
-
137
- html += '<p>否認する場合は、<a href="' + url + 'ng">[否認]</a>をクリックしてください</p>';
138
-
139
- GmailApp.sendEmail(recipient, subject, body, { htmlBody: html });
140
-
141
-
142
34
 
143
35
  }
144
36
 
145
- function doGet(e) {
37
+ const sendMessage = (e) => {
146
38
 
147
-
39
+ e.range.getSheet().getRange(e.range.getRow(), 11).setValue('確認中');
148
40
 
149
- var row = e.parameter.row;
41
+ const bodies = generateBodies(e.values);
150
42
 
151
- var sheet = SpreadsheetApp.getActiveSheet();
43
+ const url = `https://script.google.com/~~~~~/exec?row=${e.range.getRow()}&answer=`; //公開したウェブアプリケーションのURL
152
44
 
153
- var values = sheet.getRange(row, 1, 1, 11).getValues()[0];
45
+ const to = getMailAddr(e.values[8]);
154
46
 
155
- var bodies = generateBodies(values);
47
+ const subject = "出張承認申請のお知らせ";
156
48
 
157
-
49
+ const body = `以下の出張承認申請がありました。
158
50
 
159
- var answer = e.parameter.answer;
51
+ ${bodies.plain}
160
52
 
161
- var result = {
53
+ 承認する場合は、以下URLをクリックしてください
162
54
 
163
- ok: '承認',
55
+ ${url}ok
164
56
 
165
- ng: '否認'
57
+ 否認する場合は、以下URLをクリックしてください
166
58
 
167
- };
59
+ ${url}ok`;
168
60
 
169
-
61
+ const html = `<h1>出張承認申請のお知らせ</h1>
170
62
 
171
- if(answer){
63
+ <p>以下の出張承認申請がありました。</p>
172
64
 
173
- sheet.getRange(row, 11).setValue(result[answer]);
65
+ ${bodies.html}
174
66
 
175
-
67
+ <p>承認する場合は、<a href="${url}ok">[承認]</a>をクリックしてください</p>
176
68
 
177
-
69
+ <p>否認する場合は、<a href="${url}ng">[否認]</a>をクリックしてください</p>`;
178
70
 
179
- var recipient = values[9];
180
-
181
- var subject = '出張承認申請' + result[answer] + 'のお知らせ';
182
-
183
-
184
-
185
- var body = '';
186
-
187
- body += '以下の出張承認申請が' + result[answer] + 'されました。\n\n';
188
-
189
- body += bodies.plain;
190
-
191
-
192
-
193
- var html = '';
194
-
195
- html += '<h1>出張承認申請' + result[answer] + 'のお知らせ</h1>';
196
-
197
- html += '<p>以下の出張承認申請が' + result[answer] + 'されました。</p>';
198
-
199
- html += bodies.html;
200
-
201
-
202
-
203
- GmailApp.sendEmail(recipient, subject, body, { htmlBody: html });
71
+ GmailApp.sendEmail(to, subject, body, { htmlBody: html });
204
-
205
-
206
-
207
- var html = '';
208
-
209
- html += '<h1>出張承認申請の' + result[answer] + '</h1>';
210
-
211
- html += '<p>あなたは以下の出張承認申請を' + result[answer] + 'しました</p>';
212
-
213
- html += bodies.html;
214
-
215
-
216
-
217
- return HtmlService.createHtmlOutput(html);
218
-
219
- }
220
72
 
221
73
  }
222
74
 
223
- ```
75
+ const doGet = (e) => {
224
76
 
225
- ### 試したこと
77
+ const sheetId = "";
226
78
 
227
- [こちら](https://teratail.com/questions/146576)で紹介されている内容を
79
+ const sheetName = "回答";
228
80
 
81
+ const result = {
82
+
83
+ ok: '承認',
84
+
85
+ ng: '否認'
86
+
87
+ };
88
+
89
+ const row = e.parameter.row;
90
+
91
+ const approval = result[e.parameter.answer];
92
+
93
+ if(!approval) return;
94
+
95
+ const sheet = SpreadsheetApp.openById(sheetId).getSheetByName(sheetName);
96
+
97
+ sheet.getRange(row, 11).setValue(approval);
98
+
99
+
100
+
101
+ const values = sheet.getRange(row, 1, 1, 11).getValues()[0];
102
+
103
+ const message = generateMessageBody(values);
104
+
105
+ const to = getMailAddr(values[8]);;
106
+
107
+ const subject = `出張承認申請${approval}のお知らせ`;
108
+
109
+ const header = `以下の出張承認申請が${approval}されました。`;
110
+
111
+ const body = `${header}
112
+
113
+
114
+
115
+ ${message.plain}`;
116
+
117
+ const html = `<h1>${subject}</h1>
118
+
119
+ <p>${header}</p>
120
+
121
+ ${bodies.html}`;
122
+
229
- var recipient = 'xxxx@xxxx.xxx';の下にただ追加してみたのですが、うまくいかず。。。
123
+ GmailApp.sendEmail(recipient, subject, body, { htmlBody: html });
124
+
125
+ return HtmlService.createHtmlOutput(`${header}<p>あなたは以下の出張承認申請を${approval}しました</p>${bodies.html}`);
126
+
127
+ }
128
+
129
+ ```