質問編集履歴
8
特定にあたる部分を削除
test
CHANGED
File without changes
|
test
CHANGED
@@ -15,19 +15,19 @@
|
|
15
15
|
function doGet(e) {
|
16
16
|
const row = e.parameter.row;
|
17
17
|
const sheet = SpreadsheetApp.getActiveSheet();
|
18
|
-
const values = sheet.getRange(row, 1, 1,
|
18
|
+
const values = sheet.getRange(row, 1, 1, ~).getValues()[0];
|
19
19
|
const bodies = generateBodies(values);
|
20
20
|
const answer = e.parameter.answer;
|
21
|
-
const
|
21
|
+
const 出発 = e.parameter.start_date;
|
22
|
-
const
|
22
|
+
const 帰着 = e.parameter.end_date;
|
23
|
-
const
|
23
|
+
const 理由 = e.parameter.reason;
|
24
24
|
|
25
25
|
const result = {
|
26
26
|
ok: '承認',
|
27
27
|
ng: '否認'
|
28
28
|
};
|
29
29
|
|
30
|
-
sheet.getRange(row,
|
30
|
+
sheet.getRange(row, ~).setValue(result[answer]);
|
31
31
|
|
32
32
|
// answerが「ok」、すなわち承認のリンクがクリックされた場合は、Googleカレンダーにスケジュールを登録する。
|
33
33
|
if (answer === 'ok') {
|
@@ -54,30 +54,13 @@
|
|
54
54
|
}
|
55
55
|
|
56
56
|
function generateBodies(values){
|
57
|
-
const [
|
57
|
+
const [~] = values;
|
58
58
|
|
59
59
|
let plain = '';
|
60
|
-
plain += `公文書番号: ${number}\n`;
|
61
|
-
plain += `出発日時: ${start_date}\n`;
|
62
|
-
plain += `帰着日時: ${end_date}\n`;
|
63
|
-
plain += `出張理由(名前): ${reason}\n`;
|
64
|
-
plain += `主催: ${organization}\n`;
|
65
|
-
plain += `
|
60
|
+
plain += `~\n`;
|
66
|
-
plain += `引率: ${leeding}\n`;
|
67
|
-
plain += `宿泊: ${lodging}\n`;
|
68
|
-
plain += `
|
61
|
+
plain += `~\n\n`;
|
69
|
-
plain += `高速: ${freeway}\n\n`;
|
70
62
|
let html = '<ul>';
|
71
|
-
html += `<li>公文書番号: ${number}</li>`;
|
72
|
-
html += `<li>出発日時: ${start_date}</li>`;
|
73
|
-
html += `<li>帰着日時: ${end_date}</li>`;
|
74
|
-
html += `<li>出張理由(名前): ${reason}</li>`;
|
75
|
-
html += `<li>主催: ${organization}</li>`;
|
76
|
-
html += `<li>出張場所: ${place}</li>`;
|
77
|
-
html += `<li>引率: ${leeding}</li>`;
|
78
|
-
html += `<li>宿泊: ${lodging}</li>`;
|
79
|
-
html += `<li>
|
63
|
+
html += `<li>~</li>`;
|
80
|
-
html += `<li>高速: ${freeway}</li>`;
|
81
64
|
html += '</ul>';
|
82
65
|
return {
|
83
66
|
email: email,
|
@@ -90,16 +73,16 @@
|
|
90
73
|
|
91
74
|
const row = e.range.getRow();
|
92
75
|
const sheet = e.range.getSheet();
|
93
|
-
sheet.getRange(row,
|
76
|
+
sheet.getRange(row, ~).setValue('確認中');
|
94
77
|
const bodies = generateBodies(e.values);
|
95
78
|
let url = 'https://script.google.com/a/macros/~/s/~';
|
96
79
|
|
97
80
|
// 出張期間の開始日
|
98
|
-
const timestampStart = e.values[
|
81
|
+
const timestampStart = e.values[~].getTime();
|
99
82
|
// 出張期間の終了日
|
100
|
-
const timestampEnd = e.values[
|
83
|
+
const timestampEnd = e.values[~].getTime();
|
101
84
|
// 出張用件
|
102
|
-
const textReason = e.values[
|
85
|
+
const textReason = e.values[~];
|
103
86
|
|
104
87
|
url += `?start_date=${timestampStart}&end_date=${timestampEnd}&reason=${textReason}&row=${row}&answer=`;
|
105
88
|
|
7
余分な空白などを削除した
test
CHANGED
File without changes
|
test
CHANGED
@@ -12,7 +12,6 @@
|
|
12
12
|
実際のコードは下記です。
|
13
13
|
|
14
14
|
``````````````````````````````````````````````````````````````````
|
15
|
-
|
16
15
|
function doGet(e) {
|
17
16
|
const row = e.parameter.row;
|
18
17
|
const sheet = SpreadsheetApp.getActiveSheet();
|
@@ -98,7 +97,7 @@
|
|
98
97
|
// 出張期間の開始日
|
99
98
|
const timestampStart = e.values[1].getTime();
|
100
99
|
// 出張期間の終了日
|
101
|
-
|
100
|
+
const timestampEnd = e.values[2].getTime();
|
102
101
|
// 出張用件
|
103
102
|
const textReason = e.values[3];
|
104
103
|
|
@@ -133,7 +132,6 @@
|
|
133
132
|
var cal = CalendarApp.getCalendarById(CALID);
|
134
133
|
cal.createEvent(textReason, new Date(timestampStart), new Date(timestampEnd));
|
135
134
|
}
|
136
|
-
|
137
135
|
``````````````````````````````````````````````````````````````````
|
138
136
|
|
139
137
|
どうぞよろしくお願いいたします。
|
6
必要のないところを省いた
test
CHANGED
File without changes
|
test
CHANGED
@@ -67,7 +67,7 @@
|
|
67
67
|
plain += `引率: ${leeding}\n`;
|
68
68
|
plain += `宿泊: ${lodging}\n`;
|
69
69
|
plain += `交通手段: ${car}\n`;
|
70
|
-
plain += `高速
|
70
|
+
plain += `高速: ${freeway}\n\n`;
|
71
71
|
let html = '<ul>';
|
72
72
|
html += `<li>公文書番号: ${number}</li>`;
|
73
73
|
html += `<li>出発日時: ${start_date}</li>`;
|
@@ -78,7 +78,7 @@
|
|
78
78
|
html += `<li>引率: ${leeding}</li>`;
|
79
79
|
html += `<li>宿泊: ${lodging}</li>`;
|
80
80
|
html += `<li>交通手段: ${car}</li>`;
|
81
|
-
html += `<li>高速
|
81
|
+
html += `<li>高速: ${freeway}</li>`;
|
82
82
|
html += '</ul>';
|
83
83
|
return {
|
84
84
|
email: email,
|
5
指摘いただいた部分を修正してのせた
test
CHANGED
File without changes
|
test
CHANGED
@@ -10,32 +10,43 @@
|
|
10
10
|
|
11
11
|
|
12
12
|
実際のコードは下記です。
|
13
|
+
|
13
|
-
|
14
|
+
``````````````````````````````````````````````````````````````````
|
15
|
+
|
14
16
|
function doGet(e) {
|
15
17
|
const row = e.parameter.row;
|
16
18
|
const sheet = SpreadsheetApp.getActiveSheet();
|
17
19
|
const values = sheet.getRange(row, 1, 1, 13).getValues()[0];
|
18
20
|
const bodies = generateBodies(values);
|
19
21
|
const answer = e.parameter.answer;
|
22
|
+
const timestampStart = e.parameter.start_date;
|
23
|
+
const timestampEnd = e.parameter.end_date;
|
24
|
+
const textReason = e.parameter.reason;
|
25
|
+
|
20
|
-
|
26
|
+
const result = {
|
21
27
|
ok: '承認',
|
22
28
|
ng: '否認'
|
23
29
|
};
|
24
30
|
|
25
|
-
|
31
|
+
sheet.getRange(row, 13).setValue(result[answer]);
|
32
|
+
|
33
|
+
// answerが「ok」、すなわち承認のリンクがクリックされた場合は、Googleカレンダーにスケジュールを登録する。
|
34
|
+
if (answer === 'ok') {
|
35
|
+
registerSchedule(textReason, timestampStart, timestampEnd);
|
36
|
+
}
|
26
37
|
|
27
38
|
const recipient = bodies.email;
|
28
39
|
const subject = `出張申請${result[answer]}のお知らせ`;
|
29
40
|
let body = '';
|
30
|
-
body += `出張申請が${result[answer]}されました。\n\n`;
|
41
|
+
body += `出張申請が${result[answer]} されました。\n\n`;
|
31
42
|
body += bodies.plain;
|
32
|
-
|
43
|
+
|
33
44
|
let html = '';
|
34
45
|
html += `<h1>出張申請${result[answer]}のお知らせ</h1>`;
|
35
46
|
html += `<p>以下の出張申請が${result[answer]}されました。</p>`;
|
36
47
|
html += bodies.html;
|
37
|
-
|
48
|
+
|
38
|
-
GmailApp.sendEmail(recipient, subject, body, {htmlBody: html});
|
49
|
+
GmailApp.sendEmail(recipient, subject, body, { htmlBody: html });
|
39
50
|
html = '';
|
40
51
|
html += `<h1>出張申請の${result[answer]}</h1>`;
|
41
52
|
html += `<p>あなたは以下の出張申請を${result[answer]}しました</p>`;
|
@@ -46,7 +57,6 @@
|
|
46
57
|
function generateBodies(values){
|
47
58
|
const [timeStamp,email,number,start_date,end_date,reason,organization,place,leeding,lodging,car,freeway] = values;
|
48
59
|
|
49
|
-
|
50
60
|
let plain = '';
|
51
61
|
plain += `公文書番号: ${number}\n`;
|
52
62
|
plain += `出発日時: ${start_date}\n`;
|
@@ -77,18 +87,24 @@
|
|
77
87
|
};
|
78
88
|
}
|
79
89
|
|
80
|
-
|
81
90
|
function sendMessage(e) {
|
82
91
|
|
83
92
|
const row = e.range.getRow();
|
84
93
|
const sheet = e.range.getSheet();
|
85
94
|
sheet.getRange(row, 13).setValue('確認中');
|
86
95
|
const bodies = generateBodies(e.values);
|
87
|
-
let url = '
|
96
|
+
let url = 'https://script.google.com/a/macros/~/s/~';
|
88
97
|
|
98
|
+
// 出張期間の開始日
|
99
|
+
const timestampStart = e.values[1].getTime();
|
100
|
+
// 出張期間の終了日
|
101
|
+
const timestampEnd = e.values[2].getTime();
|
102
|
+
// 出張用件
|
89
|
-
|
103
|
+
const textReason = e.values[3];
|
104
|
+
|
90
|
-
|
105
|
+
url += `?start_date=${timestampStart}&end_date=${timestampEnd}&reason=${textReason}&row=${row}&answer=`;
|
106
|
+
|
91
|
-
const recipient = '管理者メールアドレス';
|
107
|
+
const recipient = '管理者のメールアドレス';
|
92
108
|
const subject = '出張申請のお知らせ';
|
93
109
|
let body = '';
|
94
110
|
body += '以下の申請があります。\n\n';
|
@@ -104,30 +120,21 @@
|
|
104
120
|
html += bodies.html;
|
105
121
|
html += `<p>承認する場合は、<a href="${url}ok">[承認]</a>をクリックしてください</p>`;
|
106
122
|
html += `<p>否認する場合は、<a href="${url}ng">[否認]</a>をクリックしてください</p>`;
|
107
|
-
|
108
|
-
GmailApp.sendEmail(recipient, subject, body, {htmlBody: html});
|
109
123
|
|
110
|
-
}
|
124
|
+
GmailApp.sendEmail(recipient, subject, body, { htmlBody: html });
|
111
125
|
|
112
|
-
|
113
|
-
【補足 活用できれば】
|
114
|
-
●申請フォーム回答で問答無用にカレンダーに反映されるコード
|
115
|
-
function submit(e){
|
116
|
-
// Googleフォームの回答を取得する
|
117
|
-
var itemResponses = e.response.getItemResponses();
|
118
|
-
// 出張理由
|
119
|
-
var name = itemResponses[3].getResponse()
|
120
|
-
// 出張日時
|
121
|
-
var start_date = itemResponses[1].getResponse()
|
122
|
-
// 帰着日時
|
123
|
-
var end_date = itemResponses[2].getResponse()
|
124
|
-
|
125
|
-
// カレンダーに予定を追加する
|
126
|
-
var CALID = "~";
|
127
|
-
var cal = CalendarApp.getCalendarById(CALID);
|
128
|
-
cal.createEvent(reason, new Date(start_date), new Date(end_date));
|
129
126
|
}
|
130
127
|
|
128
|
+
function registerSchedule(textReason, timestampStart, timestampEnd) {
|
129
|
+
// Googleフォームの回答を取得する
|
130
|
+
// カレンダーに予定を追加する
|
131
|
+
|
132
|
+
var CALID = "管理者のカレンダーID";
|
133
|
+
var cal = CalendarApp.getCalendarById(CALID);
|
134
|
+
cal.createEvent(textReason, new Date(timestampStart), new Date(timestampEnd));
|
135
|
+
}
|
136
|
+
|
137
|
+
``````````````````````````````````````````````````````````````````
|
131
138
|
|
132
139
|
どうぞよろしくお願いいたします。
|
133
140
|
|
4
詳細の少し省略
test
CHANGED
File without changes
|
test
CHANGED
@@ -84,7 +84,7 @@
|
|
84
84
|
const sheet = e.range.getSheet();
|
85
85
|
sheet.getRange(row, 13).setValue('確認中');
|
86
86
|
const bodies = generateBodies(e.values);
|
87
|
-
let url = '
|
87
|
+
let url = '~';
|
88
88
|
|
89
89
|
url += `?row=${row}&answer=`;
|
90
90
|
|
3
省略部分の変更
test
CHANGED
File without changes
|
test
CHANGED
@@ -17,13 +17,13 @@
|
|
17
17
|
const values = sheet.getRange(row, 1, 1, 13).getValues()[0];
|
18
18
|
const bodies = generateBodies(values);
|
19
19
|
const answer = e.parameter.answer;
|
20
|
-
|
20
|
+
const result = {
|
21
21
|
ok: '承認',
|
22
22
|
ng: '否認'
|
23
23
|
};
|
24
|
-
|
24
|
+
|
25
|
-
|
25
|
+
sheet.getRange(row, 13).setValue(result[answer]);
|
26
|
-
|
26
|
+
|
27
27
|
const recipient = bodies.email;
|
28
28
|
const subject = `出張申請${result[answer]}のお知らせ`;
|
29
29
|
let body = '';
|
@@ -44,26 +44,49 @@
|
|
44
44
|
}
|
45
45
|
|
46
46
|
function generateBodies(values){
|
47
|
-
const [
|
47
|
+
const [timeStamp,email,number,start_date,end_date,reason,organization,place,leeding,lodging,car,freeway] = values;
|
48
48
|
|
49
49
|
|
50
50
|
let plain = '';
|
51
|
+
plain += `公文書番号: ${number}\n`;
|
52
|
+
plain += `出発日時: ${start_date}\n`;
|
53
|
+
plain += `帰着日時: ${end_date}\n`;
|
54
|
+
plain += `出張理由(名前): ${reason}\n`;
|
55
|
+
plain += `主催: ${organization}\n`;
|
56
|
+
plain += `出張場所: ${place}\n`;
|
57
|
+
plain += `引率: ${leeding}\n`;
|
58
|
+
plain += `宿泊: ${lodging}\n`;
|
51
|
-
plain +=
|
59
|
+
plain += `交通手段: ${car}\n`;
|
60
|
+
plain += `高速の有無: ${freeway}\n\n`;
|
52
|
-
let html =
|
61
|
+
let html = '<ul>';
|
62
|
+
html += `<li>公文書番号: ${number}</li>`;
|
63
|
+
html += `<li>出発日時: ${start_date}</li>`;
|
64
|
+
html += `<li>帰着日時: ${end_date}</li>`;
|
65
|
+
html += `<li>出張理由(名前): ${reason}</li>`;
|
66
|
+
html += `<li>主催: ${organization}</li>`;
|
67
|
+
html += `<li>出張場所: ${place}</li>`;
|
68
|
+
html += `<li>引率: ${leeding}</li>`;
|
69
|
+
html += `<li>宿泊: ${lodging}</li>`;
|
70
|
+
html += `<li>交通手段: ${car}</li>`;
|
71
|
+
html += `<li>高速の有無: ${freeway}</li>`;
|
72
|
+
html += '</ul>';
|
53
73
|
return {
|
54
74
|
email: email,
|
55
75
|
plain: plain,
|
56
76
|
html: html
|
57
77
|
};
|
58
78
|
}
|
79
|
+
|
80
|
+
|
59
81
|
function sendMessage(e) {
|
60
82
|
|
61
83
|
const row = e.range.getRow();
|
62
84
|
const sheet = e.range.getSheet();
|
63
85
|
sheet.getRange(row, 13).setValue('確認中');
|
64
86
|
const bodies = generateBodies(e.values);
|
65
|
-
let url = '
|
87
|
+
let url = 'https://script.google.com/a/macros/sandagakuen.ed.jp/s/ID/exec';
|
88
|
+
|
66
|
-
|
89
|
+
url += `?row=${row}&answer=`;
|
67
90
|
|
68
91
|
const recipient = '管理者メールアドレス';
|
69
92
|
const subject = '出張申請のお知らせ';
|
@@ -92,17 +115,17 @@
|
|
92
115
|
function submit(e){
|
93
116
|
// Googleフォームの回答を取得する
|
94
117
|
var itemResponses = e.response.getItemResponses();
|
95
|
-
//
|
118
|
+
// 出張理由
|
96
|
-
var
|
119
|
+
var name = itemResponses[3].getResponse()
|
97
|
-
//
|
120
|
+
// 出張日時
|
98
|
-
var
|
121
|
+
var start_date = itemResponses[1].getResponse()
|
99
|
-
//
|
122
|
+
// 帰着日時
|
100
|
-
var date
|
123
|
+
var end_date = itemResponses[2].getResponse()
|
101
124
|
|
102
125
|
// カレンダーに予定を追加する
|
103
126
|
var CALID = "~";
|
104
127
|
var cal = CalendarApp.getCalendarById(CALID);
|
105
|
-
cal.createEvent(reason
|
128
|
+
cal.createEvent(reason, new Date(start_date), new Date(end_date));
|
106
129
|
}
|
107
130
|
|
108
131
|
|
2
文法の修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
出張の承認フローを作っているのですが、申請フォームに回答したら、管理者に承認か否認かを選ばせるメールが届くところまで完成しました。
|
2
2
|
もう一つ手間を加えて、承認をおせばGoogleカレンダーに反映されるようにしたいです。
|
3
|
-
フォームを送信すれば承認否認関係なくカレンダーに反映される
|
3
|
+
フォームを送信すれば承認否認関係なくカレンダーに反映されるものはできたのですが・・・
|
4
4
|
|
5
5
|
お力添えいただきたく存じます。
|
6
6
|
|
1
文法の修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
出張の承認フローを作っているのですが、申請フォームに回答したら、管理者に承認か否認かを選ばせるメールが届くところまで完成しました。
|
2
2
|
もう一つ手間を加えて、承認をおせばGoogleカレンダーに反映されるようにしたいです。
|
3
|
-
フォームを送信すれば承認否認関係なくカレンダーに反映されるまではできたのですが
|
3
|
+
フォームを送信すれば承認否認関係なくカレンダーに反映されるまではできたのですが以降がさっぱりで・・・
|
4
4
|
|
5
5
|
お力添えいただきたく存じます。
|
6
6
|
|