回答編集履歴
16
test
CHANGED
@@ -27,7 +27,7 @@
|
|
27
27
|
const index = HtmlService.createTemplateFromFile('index');
|
28
28
|
|
29
29
|
// テンプレートファイルに値を渡す。
|
30
|
-
|
30
|
+
index.value1 = 'おはよう';
|
31
31
|
|
32
32
|
// ページを構築して返す。
|
33
33
|
return index.evaluate();
|
15
test
CHANGED
@@ -180,7 +180,7 @@
|
|
180
180
|
このとき、「[**formdata イベント**](https://developer.mozilla.org/ja/docs/Web/API/HTMLFormElement/formdata_event)」が発生し、index.html の<script>タグ内に記述した「イベントハンドラー」が実行されます。
|
181
181
|
「イベントハンドラー」というのは、「イベントを処理するための関数」という意味で、具体的には下記の 「(e) => { 」以降の部分です。
|
182
182
|
|
183
|
-
この関数の中で、
|
183
|
+
この関数の中で、送信するデータ(item_dict)をセットしています。
|
184
184
|
複数のオブジェクトを送るため、`JSON.stringfy` でJSON文字列に変換しています。
|
185
185
|
```js
|
186
186
|
// フォーム送信時に発生する 'formdata' イベントを処理する関数(イベントハンドラー)を実装
|
14
test
CHANGED
@@ -28,10 +28,13 @@
|
|
28
28
|
|
29
29
|
// テンプレートファイルに値を渡す。
|
30
30
|
index.value1 = 'おはよう';
|
31
|
-
index.value2 = 'おやすみ';
|
32
31
|
|
33
32
|
// ページを構築して返す。
|
34
33
|
return index.evaluate();
|
34
|
+
}
|
35
|
+
|
36
|
+
function getMessage() {
|
37
|
+
return 'おやすみ';
|
35
38
|
}
|
36
39
|
```
|
37
40
|
|
@@ -44,12 +47,13 @@
|
|
44
47
|
</head>
|
45
48
|
<body>
|
46
49
|
<h1><?= value1 ?></h1>
|
47
|
-
<h1><?=
|
50
|
+
<h1><?= getMessage() ?></h1>
|
48
51
|
</body>
|
49
52
|
</html>
|
50
53
|
```
|
51
54
|
|
52
|
-
こ
|
55
|
+
こうすることで、HTML の `<?= ?>` で囲まれた部分に、任意の値を渡したり、GAS側で用意した関数の計算結果を表示したりできます。
|
56
|
+
(※ただし、`<?= ?>`部分の置き換えはページを読み込んで構築する時だけ行われますので、たとえばページ表示後、動的に`<?= ?>`部分を変更するということはできません)
|
53
57
|
|
54
58
|
---
|
55
59
|
createTemplateFromFile 関数の基本:
|
13
test
CHANGED
@@ -53,7 +53,7 @@
|
|
53
53
|
|
54
54
|
---
|
55
55
|
createTemplateFromFile 関数の基本:
|
56
|
-
+ `<?= ?>` が使われているHTML(テンプレートファイル)の `<?= ?>` の部分を渡された値に置き換えて、ページを構築します。
|
56
|
+
+ `<?= ?>` が使われているHTML(テンプレートファイル)の `<?= ?>` の部分を、GAS 側の変数や関数の計算結果、または渡された値に置き換えて、ページを構築します。
|
57
57
|
+ ページを返すときに、evaluate() 関数を使う必要があります。
|
58
58
|
---
|
59
59
|
|
12
test
CHANGED
@@ -86,7 +86,7 @@
|
|
86
86
|
/* フォーム送信時に呼ばれる */
|
87
87
|
function doPost(e) {
|
88
88
|
// フォームから受け取ったデータ(JSONフォーマットの文字列)を取出す。
|
89
|
-
const item_dict_json = e.parameter
|
89
|
+
const item_dict_json = e.parameter.item_dict;
|
90
90
|
|
91
91
|
// JSONフォ-マットの文字列を、オブジェクトに戻す。
|
92
92
|
const item_dict = JSON.parse(item_dict_json);
|
@@ -196,14 +196,14 @@
|
|
196
196
|
/* フォーム送信時に呼ばれる */
|
197
197
|
function doPost(e) {
|
198
198
|
// フォームから受け取ったデータ(JSONフォーマットの文字列)を取り出す。
|
199
|
-
const item_dict_json = e.parameter
|
199
|
+
const item_dict_json = e.parameter.item_dict;
|
200
200
|
|
201
201
|
// JSONフォーマットの文字列を、オブジェクトに戻す。
|
202
202
|
const item_dict = JSON.parse(item_dict_json);
|
203
203
|
以下略
|
204
204
|
```
|
205
205
|
doPost関数の引数 「e」には、先ほどのイベントハンドラー内でセットしたフォームデータが含まれています。
|
206
|
-
これを取り出すには `e.parameter
|
206
|
+
これを取り出すには `e.parameter.変数名` というようにします。
|
207
207
|
|
208
208
|
取り出されるのは、JSON.stgringify によって JSON 文字列に変換されたデータなので、これをオブジェクトにもどすために JSON.parse しています。
|
209
209
|
|
11
test
CHANGED
@@ -126,7 +126,7 @@
|
|
126
126
|
address: '東京都新宿区○ ○',
|
127
127
|
};
|
128
128
|
|
129
|
-
// フォーム送信時に
|
129
|
+
// フォーム送信時に発生する 'formdata' イベントを処理する関数(イベントハンドラー)を実装
|
130
130
|
document.getElementById('form').addEventListener('formdata', (e) => {
|
131
131
|
// フォームデ-タを格納するオブジェクト(FormDataオブジェクト)への参照を取得
|
132
132
|
const fd = e.formData;
|
@@ -179,7 +179,7 @@
|
|
179
179
|
この関数の中で、フォームに送信するデータ(item_dict)をセットしています。
|
180
180
|
複数のオブジェクトを送るため、`JSON.stringfy` でJSON文字列に変換しています。
|
181
181
|
```js
|
182
|
-
// フォーム送信時に
|
182
|
+
// フォーム送信時に発生する 'formdata' イベントを処理する関数(イベントハンドラー)を実装
|
183
183
|
document.getElementById('form').addEventListener('formdata', (e) => {
|
184
184
|
// フォームデ-タを格納するオブジェクト(FormDataオブジェクト)への参照を取得
|
185
185
|
const fd = e.formData;
|
@@ -190,7 +190,7 @@
|
|
190
190
|
```
|
191
191
|
↓
|
192
192
|
↓
|
193
|
-
(3)フォームを送信すると、
|
193
|
+
(3)フォームを送信すると、(form 要素の action 属性に指定した URL に基づき) GAS 側の doPost 関数が実行されます。
|
194
194
|
|
195
195
|
```js
|
196
196
|
/* フォーム送信時に呼ばれる */
|
10
test
CHANGED
@@ -172,7 +172,7 @@
|
|
172
172
|
(こうすることで、フォームデータを GAS のデプロイURLで受け取れる)
|
173
173
|
↓
|
174
174
|
↓
|
175
|
-
(2)「送信」ボタンを押すと、フォームデータが送信されます。
|
175
|
+
(2)「送信」ボタンを押すと、フォームデータが form 要素の action 属性に指定した URL に対して送信されます。
|
176
176
|
このとき、「[**formdata イベント**](https://developer.mozilla.org/ja/docs/Web/API/HTMLFormElement/formdata_event)」が発生し、index.html の<script>タグ内に記述した「イベントハンドラー」が実行されます。
|
177
177
|
「イベントハンドラー」というのは、「イベントを処理するための関数」という意味で、具体的には下記の 「(e) => { 」以降の部分です。
|
178
178
|
|
@@ -181,7 +181,7 @@
|
|
181
181
|
```js
|
182
182
|
// フォーム送信時に呼ばれる 'formdata' イベントを処理する関数(イベントハンドラー)を実装
|
183
183
|
document.getElementById('form').addEventListener('formdata', (e) => {
|
184
|
-
// フォームデ
|
184
|
+
// フォームデ-タを格納するオブジェクト(FormDataオブジェクト)への参照を取得
|
185
185
|
const fd = e.formData;
|
186
186
|
|
187
187
|
// フォーム送信先(コード.gs の doPost 関数)に送信するデータをセット
|
9
test
CHANGED
@@ -85,10 +85,10 @@
|
|
85
85
|
|
86
86
|
/* フォーム送信時に呼ばれる */
|
87
87
|
function doPost(e) {
|
88
|
-
// フォームから受け取ったデータ(JSONフォーマットの文字列)を取
|
88
|
+
// フォームから受け取ったデータ(JSONフォーマットの文字列)を取出す。
|
89
89
|
const item_dict_json = e.parameters.item_dict;
|
90
90
|
|
91
|
-
// JSONフォ
|
91
|
+
// JSONフォ-マットの文字列を、オブジェクトに戻す。
|
92
92
|
const item_dict = JSON.parse(item_dict_json);
|
93
93
|
|
94
94
|
// テンプレートファイルを読み込む
|
@@ -123,15 +123,15 @@
|
|
123
123
|
// 送信用のデータ。
|
124
124
|
let item_dict = {
|
125
125
|
date: '2023/01/01',
|
126
|
-
address: '東京都新宿区○○',
|
126
|
+
address: '東京都新宿区○ ○',
|
127
127
|
};
|
128
128
|
|
129
129
|
// フォーム送信時に呼ばれる 'formdata' イベントを処理する関数(イベントハンドラー)を実装
|
130
130
|
document.getElementById('form').addEventListener('formdata', (e) => {
|
131
|
-
// フォームデ
|
131
|
+
// フォームデ-タを格納するオブジェクト(FormDataオブジェクト)への参照を取得
|
132
132
|
const fd = e.formData;
|
133
133
|
|
134
|
-
// フォーム送信先(result.html)に送信するデータをセット
|
134
|
+
// フォーム送信先(result.html)に送信するデータをセット.
|
135
135
|
fd.set('item_dict', JSON.stringify(item_dict));
|
136
136
|
});
|
137
137
|
</script>
|
8
test
CHANGED
@@ -128,7 +128,7 @@
|
|
128
128
|
|
129
129
|
// フォーム送信時に呼ばれる 'formdata' イベントを処理する関数(イベントハンドラー)を実装
|
130
130
|
document.getElementById('form').addEventListener('formdata', (e) => {
|
131
|
-
// フォームデータを格納するオブジェクトを取得
|
131
|
+
// フォームデータを格納するオブジェクト(FormDataオブジェクト)への参照を取得
|
132
132
|
const fd = e.formData;
|
133
133
|
|
134
134
|
// フォーム送信先(result.html)に送信するデータをセット
|
7
test
CHANGED
@@ -168,7 +168,8 @@
|
|
168
168
|
(1)GASでデプロイして発行したURLをブラウザに入力すると、コード.gs の doGet関数が呼ばれ、index.html が返されます。
|
169
169
|
このとき、index.html内の form要素の `<?= url ?>` の部分を、GAS Web アプリのデプロイURL に置き換えています。
|
170
170
|
|
171
|
-
なぜこのようにするかといえば、フォーム送信時に、**form 要素の action 属性に指定した URL** に対してフォームデータが POST される
|
171
|
+
なぜこのようにするかといえば、フォーム送信時に、**form 要素の action 属性に指定した URL** に対してフォームデータが POST されるためです。
|
172
|
+
(こうすることで、フォームデータを GAS のデプロイURLで受け取れる)
|
172
173
|
↓
|
173
174
|
↓
|
174
175
|
(2)「送信」ボタンを押すと、フォームデータが送信されます。
|
6
test
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
|
8
8
|
---
|
9
9
|
|
10
|
-
下記のコードは基本的な動作を理解していただく目的のために簡略化しています。(簡略といっても省略しているわけではなく、コピペしてデプロイすれば動作します)。実際には動作を理解した上で、質問者さんのアプリに適用してください。
|
10
|
+
下記のコードは基本的な動作を理解していただく目的のために簡略化しています。(簡略といっても省略しているわけではなく、コピペしてデプロイすれば動作します)。実際には動作を理解した上で、質問者さんのアプリに適用してください。また、コード中のコメントが冗長になっていますが説明のためですので、御承知おきください。
|
11
11
|
|
12
12
|
---
|
13
13
|
|
@@ -18,16 +18,19 @@
|
|
18
18
|
[**createTemplateFromFile**](https://developers.google.com/apps-script/reference/html/html-service#createtemplatefromfilefilename) を使います。
|
19
19
|
|
20
20
|
|
21
|
-
以下は動作するサンプルコードです。ためしに新しいファイルに記述してWebアプリとしてデプロイすると動作がわかりやすいかと思います。
|
21
|
+
・以下は動作するサンプルコードです。ためしに新しいファイルに記述してWebアプリとしてデプロイすると動作がわかりやすいかと思います。
|
22
22
|
|
23
23
|
<コード.gs>
|
24
24
|
```js
|
25
25
|
function doGet() {
|
26
|
+
// テンプレートファイルを読み込む
|
26
27
|
const index = HtmlService.createTemplateFromFile('index');
|
28
|
+
|
27
29
|
// テンプレートファイルに値を渡す。
|
28
30
|
index.value1 = 'おはよう';
|
29
31
|
index.value2 = 'おやすみ';
|
32
|
+
|
30
|
-
// ページを返す。
|
33
|
+
// ページを構築して返す。
|
31
34
|
return index.evaluate();
|
32
35
|
}
|
33
36
|
```
|
@@ -71,9 +74,12 @@
|
|
71
74
|
```js
|
72
75
|
/* 初期ページ表示時に呼ばれる */
|
73
76
|
function doGet(e) {
|
77
|
+
// テンプレートファイルを読み込む
|
74
78
|
var index = HtmlService.createTemplateFromFile("index");
|
75
79
|
// WebアプリのURLを index.html に渡す。
|
76
80
|
index.url = ScriptApp.getService().getUrl();
|
81
|
+
|
82
|
+
// ページを構築して返す
|
77
83
|
return index.evaluate();
|
78
84
|
}
|
79
85
|
|
@@ -84,14 +90,15 @@
|
|
84
90
|
|
85
91
|
// JSONフォーマットの文字列を、オブジェクトに戻す。
|
86
92
|
const item_dict = JSON.parse(item_dict_json);
|
93
|
+
|
87
|
-
|
94
|
+
// テンプレートファイルを読み込む
|
88
95
|
const result = HtmlService.createTemplateFromFile("result");
|
89
96
|
|
90
97
|
// フォームから受け取ったデータを result.html に渡す。
|
91
98
|
result.date = item_dict.date;
|
92
99
|
result.address = item_dict.address;
|
93
100
|
|
94
|
-
// ページを返す
|
101
|
+
// ページを構築して返す
|
95
102
|
return result.evaluate();
|
96
103
|
}
|
97
104
|
```
|
5
test
CHANGED
@@ -165,8 +165,8 @@
|
|
165
165
|
↓
|
166
166
|
↓
|
167
167
|
(2)「送信」ボタンを押すと、フォームデータが送信されます。
|
168
|
-
このとき、「[**formdata イベント**](https://developer.mozilla.org/ja/docs/Web/API/HTMLFormElement/formdata_event)」が発生し、index.html の<script>タグ内に記述した「イベントハンドラ」が実行されます。
|
168
|
+
このとき、「[**formdata イベント**](https://developer.mozilla.org/ja/docs/Web/API/HTMLFormElement/formdata_event)」が発生し、index.html の<script>タグ内に記述した「イベントハンドラー」が実行されます。
|
169
|
-
「イベントハンドラ」というのは、「イベントを処理するための関数」という意味で、具体的には下記の 「(e) => { 」以降の部分です。
|
169
|
+
「イベントハンドラー」というのは、「イベントを処理するための関数」という意味で、具体的には下記の 「(e) => { 」以降の部分です。
|
170
170
|
|
171
171
|
この関数の中で、フォームに送信するデータ(item_dict)をセットしています。
|
172
172
|
複数のオブジェクトを送るため、`JSON.stringfy` でJSON文字列に変換しています。
|
@@ -194,7 +194,7 @@
|
|
194
194
|
const item_dict = JSON.parse(item_dict_json);
|
195
195
|
以下略
|
196
196
|
```
|
197
|
-
doPost関数の引数 「e」には、先ほどのイベントハンドラ内でセットしたフォームデータが含まれています。
|
197
|
+
doPost関数の引数 「e」には、先ほどのイベントハンドラー内でセットしたフォームデータが含まれています。
|
198
198
|
これを取り出すには `e.parameters.変数名` というようにします。
|
199
199
|
|
200
200
|
取り出されるのは、JSON.stgringify によって JSON 文字列に変換されたデータなので、これをオブジェクトにもどすために JSON.parse しています。
|
4
test
CHANGED
@@ -165,7 +165,7 @@
|
|
165
165
|
↓
|
166
166
|
↓
|
167
167
|
(2)「送信」ボタンを押すと、フォームデータが送信されます。
|
168
|
-
このとき、formdata イベントが発生し、index.html の<script>タグ内に
|
168
|
+
このとき、「[**formdata イベント**](https://developer.mozilla.org/ja/docs/Web/API/HTMLFormElement/formdata_event)」が発生し、index.html の<script>タグ内に記述した「イベントハンドラ」が実行されます。
|
169
169
|
「イベントハンドラ」というのは、「イベントを処理するための関数」という意味で、具体的には下記の 「(e) => { 」以降の部分です。
|
170
170
|
|
171
171
|
この関数の中で、フォームに送信するデータ(item_dict)をセットしています。
|
@@ -176,7 +176,7 @@
|
|
176
176
|
// フォームデータを格納するオブジェクトを取得
|
177
177
|
const fd = e.formData;
|
178
178
|
|
179
|
-
// フォーム送信先(
|
179
|
+
// フォーム送信先(コード.gs の doPost 関数)に送信するデータをセット
|
180
180
|
fd.set('item_dict', JSON.stringify(item_dict));
|
181
181
|
});
|
182
182
|
```
|
3
test
CHANGED
@@ -159,9 +159,9 @@
|
|
159
159
|
---
|
160
160
|
流れとしては以下のようになります。
|
161
161
|
(1)GASでデプロイして発行したURLをブラウザに入力すると、コード.gs の doGet関数が呼ばれ、index.html が返されます。
|
162
|
-
このとき、index.html内の form要素の `<?= url ?>` の部分を、
|
162
|
+
このとき、index.html内の form要素の `<?= url ?>` の部分を、GAS Web アプリのデプロイURL に置き換えています。
|
163
|
-
|
163
|
+
|
164
|
-
なぜこのようにするかといえば、フォーム送信時に
|
164
|
+
なぜこのようにするかといえば、フォーム送信時に、**form 要素の action 属性に指定した URL** に対してフォームデータが POST されるように設定するためです。
|
165
165
|
↓
|
166
166
|
↓
|
167
167
|
(2)「送信」ボタンを押すと、フォームデータが送信されます。
|
2
test
CHANGED
@@ -51,7 +51,7 @@
|
|
51
51
|
---
|
52
52
|
createTemplateFromFile 関数の基本:
|
53
53
|
+ `<?= ?>` が使われているHTML(テンプレートファイル)の `<?= ?>` の部分を渡された値に置き換えて、ページを構築します。
|
54
|
-
+ ページを返すときに、evaluate() 関数を使
|
54
|
+
+ ページを返すときに、evaluate() 関数を使う必要があります。
|
55
55
|
---
|
56
56
|
|
57
57
|
|
@@ -60,7 +60,8 @@
|
|
60
60
|
|
61
61
|
ではフォームの submit(=送信時)に任意のデータ(今回でいえば領収書内に記載する金額やユーザー情報等のデータ)を渡すにはどうすればよいでしょうか。
|
62
62
|
|
63
|
-
これには複数のやり方がありますが、[**formdata イベント**](https://developer.mozilla.org/ja/docs/Web/API/HTMLFormElement/formdata_event)を利用してみるのはいかがでしょうか。
|
63
|
+
これには複数のやり方がありますが、[**formdata イベント**](https://developer.mozilla.org/ja/docs/Web/API/HTMLFormElement/formdata_event)を利用してみるのはいかがでしょうか。
|
64
|
+
(注:質問文記載のアプリの動作を考察すると、ユーザーに文字を手入力させる要素がなく、特に入力内容のチェックも不要であるようなので、その前提でこの方法を採用しています。仮に入力値をチェック(バリデーション)する必要があるような場合は、別の方法になります)
|
64
65
|
|
65
66
|
具体的には、formdata イベントのイベントハンドラー内に「送信したいデータをフォームデータに追加する処理」を記述する、ということです。
|
66
67
|
|
1
コードタグ修正 HTML→html
test
CHANGED
@@ -33,7 +33,7 @@
|
|
33
33
|
```
|
34
34
|
|
35
35
|
<index.html>
|
36
|
-
```
|
36
|
+
```html
|
37
37
|
<!DOCTYPE html>
|
38
38
|
<html>
|
39
39
|
<head>
|
@@ -96,7 +96,7 @@
|
|
96
96
|
```
|
97
97
|
|
98
98
|
<index.html>
|
99
|
-
```
|
99
|
+
```html
|
100
100
|
<!DOCTYPE html>
|
101
101
|
<html>
|
102
102
|
|
@@ -133,7 +133,7 @@
|
|
133
133
|
```
|
134
134
|
|
135
135
|
<result.html>
|
136
|
-
```
|
136
|
+
```html
|
137
137
|
<!DOCTYPE html>
|
138
138
|
<!-- 返却用html -->
|
139
139
|
<html>
|