回答編集履歴

6

 

2022/09/06 14:04

投稿

退会済みユーザー
test CHANGED
@@ -221,4 +221,4 @@
221
221
 
222
222
  ---
223
223
 
224
- 他にもいくつかありますが、細かいので割愛させていただきます。
224
+ 他にも直した点はいくつかありますが、細かいので説明は割愛させていただきます。修正前のコードを見比べてみてください。

5

 

2022/09/06 14:03

投稿

退会済みユーザー
test CHANGED
@@ -213,9 +213,9 @@
213
213
 
214
214
  ---
215
215
 
216
- また、テンプレートシートのinput1~input4 をフォームの回答内容に置き換える処理の部分を、getExcel 関数から、呼び出し元 (myFynction内) に変えています。
216
+ また、getExcel 関数内にある「テンプレートシートのinput1~input4 をフォームの回答内容に置き換える処理を、getExcel 関数から、呼び出し元 (myFynction内) に移動しています。
217
- まず修正前はtextFinderで置き換える処理前にreturnしているので、テンプレートシート内の文字の置き換え処理が実行されていません。
217
+ まず修正前は textFinder で置き換える処理より前に return してしまっているので、テンプレートシート内の文字の置き換え処理自体が実行されていません。
218
- そこで、textFinder を getExcel 内で returnより前に移動てみます。すると、今度は変数 staff_nameや request_date が定義されていないというエラーが起きます。
218
+ そこで、textFinder を getExcel 内で returnより前に移動させてみます。しかしそうすると、今度は変数 staff_nameや request_date が定義されていないというエラーが起きてしいます。
219
219
  これを解決するために、置き換え処理の部分を myFynction内 に移動しています。
220
220
  (移動せずとも解決する方法はありますが、ここでは簡単な方を取りました)
221
221
 

4

 

2022/09/06 14:01

投稿

退会済みユーザー
test CHANGED
@@ -213,8 +213,11 @@
213
213
 
214
214
  ---
215
215
 
216
- また、テンプレートシートのinput1~input4 をフォームの回答内容に置き換える処理の部分を、getExcel 関数から、呼び出し元に変えています。
217
- これは、そのまだと変数 staff_nameや request_date が定義されていないというエラーになるからです。(そもそも修正前はtextFinderで置き換える処理の前にreturnしているので、テンプレートシート内の文字の置き換え処理が実行されずエラーにすらなっていません。textFinder を returnより前に移動すると、変数 staff_nameや request_date が定義されていないというエラーが起きます。)
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

 

2022/09/06 13:58

投稿

退会済みユーザー
test CHANGED
@@ -190,7 +190,7 @@
190
190
  ```
191
191
  直した点は多岐にわたっていて全部は説明しにくいのですが、主要なところだけ。
192
192
  まず「「構文エラー: SyntaxError: Identifier 'ssid2' has already been declared 行: 360 ファイル: 自動通知.gs」」の原因について:
193
- これは、関数 getExcelの引数ssid2 と 関数内での 変数宣言 constg ssid2 =~ が重複していることが原因です。
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

追記

2022/09/06 13:08

投稿

退会済みユーザー
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

 

2022/09/04 03:50

投稿

退会済みユーザー
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, 'シート1', '添付ファイル名.xlsx');
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, 'シート1', '添付ファイル名.xlsx');
40
+ const excel= getExcel(ssid, sheetname, '添付ファイル名.xlsx');
40
41
 
41
42
  MailApp.sendEmail('宛先メールアドレス', ’件名’, '本文', {attachments:[pdf, excel]});
42
43
  ```