質問編集履歴

3

ルート画像の追加

2019/05/07 07:22

投稿

blue0524
blue0524

スコア28

test CHANGED
File without changes
test CHANGED
@@ -673,3 +673,7 @@
673
673
  </html>
674
674
 
675
675
  ```
676
+
677
+ ###### 承認ルート(画像)
678
+
679
+ ![イメージ説明](c5ae85023d67a6c3a8a95da3945b84e2.jpeg)

2

HTML追記

2019/05/07 07:22

投稿

blue0524
blue0524

スコア28

test CHANGED
File without changes
test CHANGED
@@ -78,6 +78,10 @@
78
78
 
79
79
  以上、よろしくお願いいたします。
80
80
 
81
+
82
+
83
+ ######gsコード追記
84
+
81
85
  ```GAS
82
86
 
83
87
  ★コード.gs
@@ -456,8 +460,6 @@
456
460
 
457
461
 
458
462
 
459
-
460
-
461
463
  function sendMail(values, row, user, drv, root, approved){
462
464
 
463
465
  var rowData = values[row-1];
@@ -548,12 +550,126 @@
548
550
 
549
551
  }
550
552
 
551
-
553
+ ```
554
+
552
-
555
+ ######HTML追記
556
+
553
-
557
+ ```html
558
+
554
-
559
+ ★complete.html
560
+
555
-
561
+ <!DOCTYPE html>
562
+
556
-
563
+ <html>
564
+
557
-
565
+ <head>
566
+
567
+ <base target="_top">
568
+
569
+ </head>
570
+
571
+ <body>
572
+
573
+ <h3>----------------------------------------------------------------------</h3>
574
+
575
+ <h3><b> 【処理完了】次の承認者へ通知完了。このタブを閉じてください。</b></h3>
576
+
577
+ <h3>----------------------------------------------------------------------</h3>
578
+
579
+ </body>
580
+
581
+ </html>
582
+
583
+
584
+
585
+
586
+
587
+ ★shonin.html
588
+
589
+ <!-- 承認リンクURLが押されたときに表示する画面 -->
590
+
591
+ <!DOCTYPE html>
592
+
593
+ <html>
594
+
595
+ <head>
596
+
597
+ <base target="_top">
598
+
599
+ <style>
600
+
601
+ h1 {
602
+
603
+ font-weight: normal;
604
+
605
+ }
606
+
607
+ h2 {
608
+
609
+ font-weight: normal;
610
+
611
+ }
612
+
613
+ h3 {
614
+
615
+ font-weight: normal;
616
+
617
+ }
618
+
619
+ h4 {
620
+
621
+ font-weight: normal;
622
+
623
+ }
624
+
625
+ h5 {
626
+
627
+ font-weight: normal;
628
+
629
+ }
630
+
631
+ </style>
632
+
633
+ </head>
634
+
635
+ <body>
636
+
637
+ <h4>---------------------------------------------------------</h4>
638
+
639
+ <h3><b>    設備投資稟議:承認依頼画面</b></h3>
640
+
641
+ <h4>---------------------------------------------------------</h4>
642
+
643
+ <h4>  下記<font color="#FF00FF">リンク</font>より稟議資料の内容をご確認いただき、共有ドライブ上にて承認印・コメント入力をお願いします。</h4>
644
+
645
+ <h4>  <a href="<?= drv ?>" target="_blank"><font color="#FF00FF">稟議資料へのリンク(共有ドライブ)</font></a></h4>
646
+
647
+ <h4>  捺印、入力終わりましたら、下の<font color="#0033FF">承認</font>或いは<font color="#0033FF">却下</font>を選択して<font color="#0033FF">送信</font>してください。</h4>
648
+
649
+ <form action="<?= url ?>" method="post">
650
+
651
+ <h3><b>  <input type="radio" name="shonin" value="1" checked="checked">承認
652
+
653
+ <input type="radio" name="shonin" value="0">却下
654
+
655
+ <input type="hidden" name="row" value="<?= row ?>">
656
+
657
+ <input type="hidden" name="name" value="<?= name ?>">
658
+
659
+ <input type="hidden" name="root" value="<?= root ?>">
660
+
661
+ <input type="hidden" name="drv" value="<?= drv ?>">
662
+
663
+ <input type="submit" value="送信"></b></h3>
664
+
665
+ <h5>  ◆承認のとき ・・・次の承認者へ承認依頼メールが送られます。</h5>
666
+
667
+ <h5>  ◆却下のとき ・・・申請者へ却下通知メールが送られます。</h5>
668
+
669
+ </form>
670
+
671
+ </body>
672
+
673
+ </html>
558
674
 
559
675
  ```

1

コード開示

2019/05/07 00:53

投稿

blue0524
blue0524

スコア28

test CHANGED
File without changes
test CHANGED
@@ -77,3 +77,483 @@
77
77
 
78
78
 
79
79
  以上、よろしくお願いいたします。
80
+
81
+ ```GAS
82
+
83
+ ★コード.gs
84
+
85
+ //scriptの所在
86
+
87
+ var url = "https://script.google.com/a/kaisha.co.jp/macros/s/AKf***bx4o**dYr0x*****XOM-Vs**qr*6*r-2S***wc4*UV6/exec";
88
+
89
+
90
+
91
+ //共有フォルダ
92
+
93
+ var url2 = "https://drive.google.com/drive/folders/1***Yc*gn*zQ*0Q*5ybS***r?usp=sharing";
94
+
95
+
96
+
97
+ var sheetName = "フォームの回答 1";
98
+
99
+
100
+
101
+ // FormApp.getActiveForm();
102
+
103
+
104
+
105
+ function sendFormMail(e) {
106
+
107
+
108
+
109
+ // 追加行
110
+
111
+ var row = e.range.getRow();
112
+
113
+ var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
114
+
115
+ var sheet = spreadsheet.getSheetByName(sheetName);
116
+
117
+ var name = e.namedValues["申請者"];
118
+
119
+ Logger.log(url2)
120
+
121
+ var root = e.namedValues["申請ルート選択"];
122
+
123
+ var drv = url2;
124
+
125
+ var user = getUserBy("name", name ,root);
126
+
127
+ // 承認者
128
+
129
+ var authorizer = getUserBy("id", user['authorizer_id'], root);
130
+
131
+ var address = authorizer['mail'];
132
+
133
+ var authorizer_nm = authorizer['name'];
134
+
135
+
136
+
137
+ var cols = ["申請日","申請者","申請ルート選択","稟議案件名","コメント","タイムスタンプ"];
138
+
139
+ var body="";
140
+
141
+ body += authorizer_nm + '様<br>'
142
+
143
+ body += '<br>';
144
+
145
+ body += '<span style="font-weight: normal">いつもお世話になっております。<br></span>';
146
+
147
+ body += '<br>';
148
+
149
+ body += '下記内容をご確認くださいますよう、よろしくお願いします。<br>';
150
+
151
+ body += '<br>';
152
+
153
+ cols.forEach(function(col){
154
+
155
+ body += col ;
156
+
157
+ body += " : " ;
158
+
159
+ body += '<b><font color="#0000cd">' + e.namedValues[col] + '</font></b>';
160
+
161
+ body += '<br>';
162
+
163
+ })
164
+
165
+
166
+
167
+ body += '<br>';
168
+
169
+ body += '下記ボタン【資料確認・承認ページ】をクリックしてください。<br>';
170
+
171
+
172
+
173
+
174
+
175
+ body += '<a href="'+url+"?row=" + row +"&name=" + encodeURI(authorizer['name']) + "&root=" + encodeURI(root) + "&drv=" + encodeURIComponent(drv);
176
+
177
+ body += '"><button type="button"><font size="3" color="#ff00ff">資料確認・承認ページ</font></button></a>';
178
+
179
+ Logger.log('address :%s', address);
180
+
181
+ Logger.log('authorizer_nm :%s', authorizer_nm);
182
+
183
+
184
+
185
+ GmailApp.sendEmail(address,         //宛先
186
+
187
+ '設備投資稟議:承認依頼', //件名
188
+
189
+ body , //本文
190
+
191
+ {htmlBody: body} ,
192
+
193
+ {noReply: true}
194
+
195
+ );
196
+
197
+ }
198
+
199
+
200
+
201
+
202
+
203
+ function getUserBy(key, value, root){
204
+
205
+ var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
206
+
207
+ var sh = spreadsheet.getSheetByName(root);
208
+
209
+ var values = sh.getDataRange().getValues();
210
+
211
+ var keys = headerKeys(sh);
212
+
213
+
214
+
215
+ for (var i = 0; i < values.length; i++) {
216
+
217
+ var row = values[i];
218
+
219
+ row = rowToHash(row, keys);
220
+
221
+ if (row[key] == value) {
222
+
223
+ return row;
224
+
225
+ }
226
+
227
+ }
228
+
229
+ }
230
+
231
+
232
+
233
+ // ヘッダ行を取得
234
+
235
+ function headerKeys(sh) {
236
+
237
+ return sh.getRange(1,1,1, sh.getLastColumn()).getValues()[0];
238
+
239
+ }
240
+
241
+
242
+
243
+ //行の情報をオブジェクトに変換
244
+
245
+ function rowToHash(array, keys) {
246
+
247
+ var hash = {};
248
+
249
+ array.forEach(function(value, i) {
250
+
251
+ hash[keys[i]] = value;
252
+
253
+ })
254
+
255
+ return hash;
256
+
257
+ }
258
+
259
+
260
+
261
+
262
+
263
+ // 承認ページ表示時
264
+
265
+ function doGet(e) {
266
+
267
+ //必要な値を画面に持たせておく
268
+
269
+ var row = e.parameter.row;
270
+
271
+ var name = e.parameter.name;
272
+
273
+ var root = e.parameter.root;
274
+
275
+ var drv = e.parameter.drv;
276
+
277
+
278
+
279
+ var html = HtmlService.createTemplateFromFile("shonin");
280
+
281
+
282
+
283
+ html.row = row;
284
+
285
+ html.name = name;
286
+
287
+ html.root = root;
288
+
289
+ html.url = url;
290
+
291
+ html.drv = drv;
292
+
293
+
294
+
295
+ html.method = "get";
296
+
297
+
298
+
299
+ Logger.log('html :"%s"', html);
300
+
301
+
302
+
303
+ return html.evaluate();
304
+
305
+
306
+
307
+ }
308
+
309
+
310
+
311
+ function doPost(e) {
312
+
313
+ var shonin = e.parameter.shonin;
314
+
315
+ var row = e.parameter.row;
316
+
317
+ var name = e.parameter.name;
318
+
319
+ var root = e.parameter.root;
320
+
321
+ var drv = e.parameter.drv;
322
+
323
+ // シートに承認を記入
324
+
325
+ var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
326
+
327
+ var sheet = spreadsheet.getSheetByName(sheetName);
328
+
329
+ // Logger.log(sheet);
330
+
331
+
332
+
333
+ var values = sheet.getDataRange().getValues();
334
+
335
+
336
+
337
+ var rowData = values[row-1];
338
+
339
+ var idx = rowData.length;
340
+
341
+
342
+
343
+ var status = "";
344
+
345
+
346
+
347
+ var timestamp = Utilities.formatDate( new Date(), 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss');
348
+
349
+
350
+
351
+
352
+
353
+ var cur = -1;
354
+
355
+ rowData.some(function(col,i){
356
+
357
+ if (!col){//空の列を取得
358
+
359
+ idx = i;
360
+
361
+ return true;
362
+
363
+ }
364
+
365
+ });
366
+
367
+ idx++;
368
+
369
+
370
+
371
+ if (shonin == 1) {
372
+
373
+ status = "承認";
374
+
375
+ } else {
376
+
377
+ status = "却下";
378
+
379
+ }
380
+
381
+
382
+
383
+ sheet.getRange(1, idx).setValue("状態");
384
+
385
+ sheet.getRange(row, idx).setValue(status);
386
+
387
+ idx++;
388
+
389
+
390
+
391
+ sheet.getRange(1, idx).setValue("承認者");
392
+
393
+ sheet.getRange(row, idx).setValue(name);
394
+
395
+ idx++;
396
+
397
+
398
+
399
+ sheet.getRange(1, idx).setValue("処理日時");
400
+
401
+ sheet.getRange(row, idx).setValue(timestamp);
402
+
403
+
404
+
405
+ // 承認者をメールに記載するため再取得
406
+
407
+ values = sheet.getDataRange().getValues();
408
+
409
+
410
+
411
+ if (shonin == 1) {
412
+
413
+
414
+
415
+ // 次の承認者をさがす
416
+
417
+ var user = getUserBy("name", name, root);
418
+
419
+ var authorizer_id = user['authorizer_id'];
420
+
421
+
422
+
423
+ if (authorizer_id) {//上位承認者がいる場合
424
+
425
+ // 次の承認者にメール送信
426
+
427
+ var authorizer = getUserBy("id", authorizer_id ,root);
428
+
429
+ Logger.log(name + 'のauthorizer_idは'+ authorizer_id);
430
+
431
+  sendMail(values, row, authorizer, drv, root, true);
432
+
433
+
434
+
435
+ }
436
+
437
+ } else {
438
+
439
+ // 却下時は申請者にメール送信
440
+
441
+ var name = sheet.getRange(row, 2).getValue();
442
+
443
+ var user = getUserBy("name", name, root);
444
+
445
+ sendMail(values, row, user, drv, root, false);
446
+
447
+ }
448
+
449
+ var html = HtmlService.createTemplateFromFile("complete");
450
+
451
+ return html.evaluate();
452
+
453
+ }
454
+
455
+
456
+
457
+
458
+
459
+
460
+
461
+ function sendMail(values, row, user, drv, root, approved){
462
+
463
+ var rowData = values[row-1];
464
+
465
+ var body="";
466
+
467
+ body += '<br>';
468
+
469
+ body += user['name'] + '様<br>'
470
+
471
+ body += '<br>';
472
+
473
+ body += '<span style="font-weight: normal">いつもお世話になっております。<br></span>';
474
+
475
+ body += '<br>';
476
+
477
+ body += '下記内容をご確認くださいますよう、よろしくお願いします。<br>';
478
+
479
+ body += '<br>';
480
+
481
+ rowData.forEach(function(col,idx){
482
+
483
+ if (!col) return true;
484
+
485
+ var key = values[0][idx];
486
+
487
+ body += key;
488
+
489
+ body += " : ";
490
+
491
+ if (['申請日'].indexOf(key) > -1) {
492
+
493
+ body += '<b><font color="#0000cd">' + Utilities.formatDate( col, 'Asia/Tokyo', 'yyyy年M月d日') + '</font></b>';
494
+
495
+ } else if (['処理日時'].indexOf(key) > -1) {
496
+
497
+ body += '<b><font color="#0000cd">' + Utilities.formatDate( col, 'Asia/Tokyo', 'yyyy年MM月dd日 HH:mm:ss') + '</font></b>';
498
+
499
+ } else if (['共有ドライブのリンク先'].indexOf(key) > -1) {
500
+
501
+
502
+
503
+ }else {
504
+
505
+ body += '<b><font color="#0000cd">' + col + '</font></b>';
506
+
507
+ }
508
+
509
+ body += '<br>';
510
+
511
+ });
512
+
513
+
514
+
515
+ if (approved==true){
516
+
517
+ body += '<br>';
518
+
519
+ body += 'ボタン【資料確認・承認ページ】をクリックしてください。<br>'
520
+
521
+ body += '<a href="'+url+ "?row=" + row +"&name=" + encodeURI(user['name']) + "&root=" + encodeURI(root) + "&drv=" + encodeURIComponent(drv);
522
+
523
+ body += '"><button type="button"><font size="3" color="#ff00ff">資料確認・承認ページ</font></button></a>';
524
+
525
+
526
+
527
+ }else{
528
+
529
+ body += "承認が却下されました。";
530
+
531
+ }
532
+
533
+
534
+
535
+ var address = user['mail'];
536
+
537
+ var title = approved ? "設備投資稟議:承認依頼" : "承認依頼が却下されました";
538
+
539
+ GmailApp.sendEmail(address,
540
+
541
+ title,
542
+
543
+ body ,
544
+
545
+ {htmlBody: body} ,
546
+
547
+ {noReply: true});
548
+
549
+ }
550
+
551
+
552
+
553
+
554
+
555
+
556
+
557
+
558
+
559
+ ```