回答編集履歴
6
test
CHANGED
@@ -221,4 +221,4 @@
|
|
221
221
|
|
222
222
|
---
|
223
223
|
|
224
|
-
他にもいくつかありますが、細かいので割愛させていただきます。
|
224
|
+
他にも直した点はいくつかありますが、細かいので説明は割愛させていただきます。修正前のコードを見比べてみてください。
|
5
test
CHANGED
@@ -213,9 +213,9 @@
|
|
213
213
|
|
214
214
|
---
|
215
215
|
|
216
|
-
また、テンプレートシートのinput1~input4 をフォームの回答内容に置き換える処理
|
216
|
+
また、getExcel 関数内にある「テンプレートシートのinput1~input4 をフォームの回答内容に置き換える処理」を、getExcel 関数内から、呼び出し元 (myFynction内) に移動しています。
|
217
|
-
まず修正前はtextFinderで置き換える処理
|
217
|
+
まず、修正前は textFinder で置き換える処理より前に return してしまっているので、テンプレートシート内の文字の置き換え処理自体が実行されていません。
|
218
|
-
そこで、textFinder を getExcel 内で returnより前に移動
|
218
|
+
そこで、textFinder を getExcel 内で returnより前に移動させてみます。しかしそうすると、今度は「変数 staff_nameや request_date が定義されていない」というエラーが起きてしまいます。
|
219
219
|
これを解決するために、置き換え処理の部分を myFynction内 に移動しています。
|
220
220
|
(移動せずとも解決する方法はありますが、ここでは簡単な方を取りました)
|
221
221
|
|
4
test
CHANGED
@@ -213,8 +213,11 @@
|
|
213
213
|
|
214
214
|
---
|
215
215
|
|
216
|
-
また、テンプレートシートのinput1~input4 をフォームの回答内容に置き換える処理の部分を、getExcel 関数から、呼び出し元に変えています。
|
217
|
-
|
216
|
+
また、テンプレートシートのinput1~input4 をフォームの回答内容に置き換える処理の部分を、getExcel 関数から、呼び出し元 (myFynction内) に変えています。
|
217
|
+
まず修正前はtextFinderで置き換える処理の前にreturnしているので、テンプレートシート内の文字の置き換え処理が実行されていません。
|
218
|
+
そこで、textFinder を getExcel 内で returnより前に移動してみます。すると、今度は変数 staff_nameや request_date が定義されていないというエラーが起きます。
|
219
|
+
これを解決するために、置き換え処理の部分を myFynction内 に移動しています。
|
220
|
+
(移動せずとも解決する方法はありますが、ここでは簡単な方を取りました)
|
218
221
|
|
219
222
|
---
|
220
223
|
|
3
test
CHANGED
@@ -190,7 +190,7 @@
|
|
190
190
|
```
|
191
191
|
直した点は多岐にわたっていて全部は説明しにくいのですが、主要なところだけ。
|
192
192
|
まず「「構文エラー: SyntaxError: Identifier 'ssid2' has already been declared 行: 360 ファイル: 自動通知.gs」」の原因について:
|
193
|
-
これは、関数 getExcelの引数ssid2 と 関数内での 変数宣言 const
|
193
|
+
これは、関数 getExcelの引数ssid2 と 関数内での 変数宣言 const ssid2 =~ が重複していることが原因です。
|
194
194
|
```
|
195
195
|
function getExcel(ssid2, sheetname2, filename2) { // <---ここに引数 ssid2 がある
|
196
196
|
const ssid2 = 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'; // <---重複して ssid2 を const 宣言している、。
|
@@ -206,13 +206,15 @@
|
|
206
206
|
var ss2 = SpreadsheetApp.openById(ssid2);
|
207
207
|
var sheet = ss2.getSheetByName(sheetname2);
|
208
208
|
略
|
209
|
-
var excel = getExcel(ssid2, sheetname2, excelName); // 呼び出し元
|
209
|
+
var excel = getExcel(ssid2, sheetname2, excelName); // getExcel 関数の呼び出し元
|
210
210
|
|
211
211
|
```
|
212
212
|
こうすることで、ssid2, sheetgname2, excelName の中身が、getExcel関数の引数(ssid, sheetname, filename)それぞれに渡されます。
|
213
213
|
|
214
|
+
---
|
215
|
+
|
214
216
|
また、テンプレートシートのinput1~input4 をフォームの回答内容に置き換える処理の部分を、getExcel 関数から、呼び出し元に変えています。
|
215
|
-
これは、そのままだと変数 staff_nameや request_date が定義されていないというエラーになるからです。(そもそも修正前は置き換える前にreturnしているのでエラーになっていませんが
|
217
|
+
これは、そのままだと変数 staff_nameや request_date が定義されていないというエラーになるからです。(そもそも修正前はtextFinderで置き換える処理の前にreturnしているので、テンプレートシート内の文字の置き換え処理が実行されずエラーにすらなっていません。textFinder を returnより前に移動すると、変数 staff_nameや request_date が定義されていないというエラーが起きます。)
|
216
218
|
|
217
219
|
---
|
218
220
|
|
2
追記
test
CHANGED
@@ -41,4 +41,179 @@
|
|
41
41
|
|
42
42
|
MailApp.sendEmail('宛先メールアドレス', ’件名’, '本文', {attachments:[pdf, excel]});
|
43
43
|
```
|
44
|
-
|
44
|
+
---
|
45
|
+
# コメント追記のコードの添削
|
46
|
+
コメントに追記されたコードを直すとしたら下記のようになります。
|
47
|
+
(変更が最小限になるようにしているので、冗長な部分があったりして最適化されていません。あしからず)
|
48
|
+
```js
|
49
|
+
//フォーム送信時にPDFとスプシを添付して指定宛先にメールを送信
|
50
|
+
// FormApp.getActiveForm()
|
51
|
+
function myFunction(event) {
|
52
|
+
|
53
|
+
//今日の日付
|
54
|
+
var request_date = new Date();
|
55
|
+
|
56
|
+
// フォーム
|
57
|
+
var res = event.response.getItemResponses();
|
58
|
+
|
59
|
+
var staff_name;
|
60
|
+
var cc_mailaddress;
|
61
|
+
var proposal_num;
|
62
|
+
var project_title;
|
63
|
+
var address;
|
64
|
+
var resuest_timing;
|
65
|
+
|
66
|
+
for (var n in res) {
|
67
|
+
var item = res[n];
|
68
|
+
var name = item.getItem().getTitle();
|
69
|
+
var value = item.getResponse();
|
70
|
+
|
71
|
+
switch (name) {
|
72
|
+
case '担当':
|
73
|
+
staff_name = value; break;
|
74
|
+
case 'CC送付先(メールアドレス)':
|
75
|
+
cc_mailaddress = value; break;
|
76
|
+
case '番号':
|
77
|
+
proposal_num = value; break;
|
78
|
+
case '件名':
|
79
|
+
project_title = value; break;
|
80
|
+
case '住所':
|
81
|
+
address = value; break;
|
82
|
+
case '依頼タイミング':
|
83
|
+
resuest_timing = value; break;
|
84
|
+
}
|
85
|
+
}
|
86
|
+
|
87
|
+
// スプレッドシートURLから抽出したIDを入力
|
88
|
+
var ssid1 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
|
89
|
+
var ss = SpreadsheetApp.openById(ssid1);
|
90
|
+
// 変換元のスプレッドシート名(タブ名)
|
91
|
+
var pdfss = ss.getSheetByName("【依頼】");
|
92
|
+
var sheetid = ss.getActiveSheet().getSheetId();
|
93
|
+
|
94
|
+
pdfss.getRange("U3").setValue(request_date); //依頼日
|
95
|
+
pdfss.getRange("C3").setValue(staff_name); //担当
|
96
|
+
pdfss.getRange("H3").setValue(cc_mailaddress); //CC送付先(メールアドレス)
|
97
|
+
pdfss.getRange("F5").setValue(proposal_num); //番号
|
98
|
+
pdfss.getRange("F9").setValue(project_title); //件名
|
99
|
+
pdfss.getRange("F10").setValue(address); //住所
|
100
|
+
pdfss.getRange("K5").setValue(resuest_timing); //依頼タイミング
|
101
|
+
|
102
|
+
SpreadsheetApp.flush();
|
103
|
+
|
104
|
+
// 以下PDF化コード(サイズ=A4)
|
105
|
+
var url = "https://docs.google.com/spreadsheets/d/SSID/export?".replace("SSID", ssid1); ////////////
|
106
|
+
var url_ext = [];
|
107
|
+
|
108
|
+
var opts = {
|
109
|
+
format: "pdf",
|
110
|
+
size: "A4",
|
111
|
+
fzr: "false",
|
112
|
+
portrait: "true",
|
113
|
+
gridlines: "false",
|
114
|
+
printtitle: "false",
|
115
|
+
pagenumbers: "false",
|
116
|
+
fitw: "true",
|
117
|
+
sheetnames: "false",
|
118
|
+
gid: sheetid
|
119
|
+
};
|
120
|
+
|
121
|
+
// 上記のoptsのオプション名と値を「=」で繋げて配列url_extに格納
|
122
|
+
for (optName in opts) {
|
123
|
+
url_ext.push(optName + "=" + opts[optName]);
|
124
|
+
}
|
125
|
+
|
126
|
+
// url_extの各要素を「&」で繋げる
|
127
|
+
var options = url_ext.join("&");
|
128
|
+
Logger.log(options)
|
129
|
+
|
130
|
+
try {
|
131
|
+
// API使用のためのOAuth認証
|
132
|
+
var token = ScriptApp.getOAuthToken();
|
133
|
+
|
134
|
+
var response = UrlFetchApp.fetch(url + options, {
|
135
|
+
headers: {
|
136
|
+
"Authorization": "Bearer " + token
|
137
|
+
}
|
138
|
+
});
|
139
|
+
|
140
|
+
// Googleドライブ上のPDF格納先フォルダからIDを入力
|
141
|
+
var folder = DriveApp.getFolderById("yyyyyyyyyyyyyyyyyyyyyyyyyyyyy");
|
142
|
+
|
143
|
+
// PDFファイルを作成:ファイル名「番号_依頼(依頼タイミング)yyMMdd.pdf」
|
144
|
+
var pdfName = proposal_num + "_" + project_title + "(" + resuest_timing + ")" + Utilities.formatDate(request_date, "JST", "yyMMdd") + '.pdf';
|
145
|
+
var pdf = response.getBlob().setName(pdfName);
|
146
|
+
folder.createFile(pdf);
|
147
|
+
|
148
|
+
// テンプレートシートの取得
|
149
|
+
var ssid2 = 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz';
|
150
|
+
var sheetname2 = 'フォーマット'; // 変換元のシート名(タブ名)
|
151
|
+
var ss2 = SpreadsheetApp.openById(ssid2);
|
152
|
+
var sheet = ss2.getSheetByName(sheetname2);
|
153
|
+
|
154
|
+
// テンプレートシートの内容をフォーム入力値に置き換える。
|
155
|
+
sheet.createTextFinder('input1').replaceAllWith(staff_name);
|
156
|
+
sheet.createTextFinder('input2').replaceAllWith(request_date);
|
157
|
+
sheet.createTextFinder('input3').replaceAllWith(proposal_num);
|
158
|
+
sheet.createTextFinder('input4').replaceAllWith(project_title);
|
159
|
+
|
160
|
+
// エクセルファイルを作成:ファイル名「番号_ファイル名_yyMMdd.xlsx」
|
161
|
+
var excelName = proposal_num + "_" + "ファイル名" + "_" + Utilities.formatDate(request_date, "JST", "yyMMdd") + '.xlsx';
|
162
|
+
var excel = getExcel(ssid2, sheetname2, excelName);
|
163
|
+
folder.createFile(excel);
|
164
|
+
|
165
|
+
// メールを送信する。
|
166
|
+
MailApp.sendEmail("abc@def.jp", "【新規依頼】" + proposal_num + "_" + project_title + "(担当:" + staff_name + ")", "---------------自動通知---------------\n" + "\n" + "新規依頼を受け付けました。\n" + "エクセルファイルは必要に応じてダウンロードしてください。\n" + "\n" + Utilities.formatDate(request_date, "JST", "yyyy/MM/dd H:mm"), {//-------
|
167
|
+
attachments: [pdf, excel]
|
168
|
+
});
|
169
|
+
} catch (e) {
|
170
|
+
Logger.log("ファイル生成に失敗しました\n" + e.stack);
|
171
|
+
}
|
172
|
+
}
|
173
|
+
|
174
|
+
//以下はエクセルファイル作成用
|
175
|
+
// ssid;スプレッドシートID、
|
176
|
+
// sheetname;シート名
|
177
|
+
// filename;保存するファイル名
|
178
|
+
function getExcel(ssid, sheetname, filename) {
|
179
|
+
const ss = SpreadsheetApp.openById(ssid);
|
180
|
+
const sh = ss.getSheetByName(sheetname)
|
181
|
+
const sheetid = sh.getSheetId()
|
182
|
+
const url = 'https://docs.google.com/spreadsheets/d/' + ssid + '/export?format=xlsx&gid=' + sheetid;
|
183
|
+
const option = {
|
184
|
+
"headers": { Authorization: "Bearer " + ScriptApp.getOAuthToken() },
|
185
|
+
"muteHttpExceptions": true
|
186
|
+
};
|
187
|
+
const blob = UrlFetchApp.fetch(url, option).getBlob().setName(filename);
|
188
|
+
return blob;
|
189
|
+
}
|
190
|
+
```
|
191
|
+
直した点は多岐にわたっていて全部は説明しにくいのですが、主要なところだけ。
|
192
|
+
まず「「構文エラー: SyntaxError: Identifier 'ssid2' has already been declared 行: 360 ファイル: 自動通知.gs」」の原因について:
|
193
|
+
これは、関数 getExcelの引数ssid2 と 関数内での 変数宣言 constg ssid2 =~ が重複していることが原因です。
|
194
|
+
```
|
195
|
+
function getExcel(ssid2, sheetname2, filename2) { // <---ここに引数 ssid2 がある
|
196
|
+
const ssid2 = 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'; // <---重複して ssid2 を const 宣言している、。
|
197
|
+
```
|
198
|
+
関数の場合、引数に指定した変数は、関数の中で再度constで宣言することはできません。
|
199
|
+
const ではなくvar にすれば、一応エラーは出なくなります。
|
200
|
+
しかし、せっかく関数で引数を用意しているのですから、呼び出し元の方で関数の引数に適切な文字列等を指定して呼び出した方が良いです。
|
201
|
+
|
202
|
+
```
|
203
|
+
// テンプレートシートの取得
|
204
|
+
var ssid2 = 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz';
|
205
|
+
var sheetname2 = 'フォーマット'; // 変換元のシート名(タブ名)
|
206
|
+
var ss2 = SpreadsheetApp.openById(ssid2);
|
207
|
+
var sheet = ss2.getSheetByName(sheetname2);
|
208
|
+
略
|
209
|
+
var excel = getExcel(ssid2, sheetname2, excelName); // 呼び出し元
|
210
|
+
|
211
|
+
```
|
212
|
+
こうすることで、ssid2, sheetgname2, excelName の中身が、getExcel関数の引数(ssid, sheetname, filename)それぞれに渡されます。
|
213
|
+
|
214
|
+
また、テンプレートシートのinput1~input4 をフォームの回答内容に置き換える処理の部分を、getExcel 関数から、呼び出し元に変えています。
|
215
|
+
これは、そのままだと変数 staff_nameや request_date が定義されていないというエラーになるからです。(そもそも修正前は置き換える前にreturnしているのでエラーになっていませんが、これだと置き換え処理自体実行されていませんでした)
|
216
|
+
|
217
|
+
---
|
218
|
+
|
219
|
+
他にもいくつかありますが、細かいので割愛させていただきます。
|
1
test
CHANGED
@@ -24,7 +24,8 @@
|
|
24
24
|
|
25
25
|
```js
|
26
26
|
const ssid = '変換したいスプレッドシートのスプレッドシートID';
|
27
|
+
const sheetname = 'シート1'; // 変換元のシート名(タブ名)
|
27
|
-
const excel= getExcel(ssid,
|
28
|
+
const excel= getExcel(ssid, sheetname, '添付ファイル名.xlsx');
|
28
29
|
|
29
30
|
MailApp.sendEmail('宛先メールアドレス', ’件名’, '本文', {attachments:[excel]});
|
30
31
|
```
|
@@ -36,7 +37,7 @@
|
|
36
37
|
(略)
|
37
38
|
const pdf = response.getBlob().setName(pdfName);
|
38
39
|
(略)
|
39
|
-
const excel= getExcel(ssid,
|
40
|
+
const excel= getExcel(ssid, sheetname, '添付ファイル名.xlsx');
|
40
41
|
|
41
42
|
MailApp.sendEmail('宛先メールアドレス', ’件名’, '本文', {attachments:[pdf, excel]});
|
42
43
|
```
|