質問編集履歴

2

実際に走らせているコードの一部を、掲載致しました。

2020/10/12 06:54

投稿

yoichiyy
yoichiyy

スコア55

test CHANGED
File without changes
test CHANGED
@@ -31,3 +31,371 @@
31
31
 
32
32
 
33
33
  どうぞよろしくお願い致します。
34
+
35
+
36
+
37
+
38
+
39
+ ```
40
+
41
+ function tillDraft(){
42
+
43
+
44
+
45
+ var ss = SpreadsheetApp.openById(SpreadsheetApp.getActiveSpreadsheet().getId());
46
+
47
+ var sheet = ss.getSheetByName("graph");
48
+
49
+ var ReferenceCell = sheet.getRange("s1"); //毎回VlookUPのために、値を更新する必要がある。
50
+
51
+ var EndCell = sheet.getRange("t1");
52
+
53
+ var ssID = "略";
54
+
55
+ var sheetID = sheet.getSheetId();
56
+
57
+ var driveID = "略";
58
+
59
+
60
+
61
+ ////////////////////
62
+
63
+ //追加変数と、追加回答処理部分
64
+
65
+ ////////////////////
66
+
67
+ var DataSheet = ss.getSheetByName("data");
68
+
69
+ const CValues = DataSheet.getRange('C:C').getValues(); 
70
+
71
+ var LastRow_Answered = CValues.filter(String).length; 
72
+
73
+
74
+
75
+ //返信済み打刻されている最終行。CValues(返信まち最終行)よりも、短い。
76
+
77
+ const CZValues = DataSheet.getRange('CZ:CZ').getValues(); 
78
+
79
+ var LastRow = CZValues.filter(String).length;  
80
+
81
+
82
+
83
+ //未処理の回答数をカウント
84
+
85
+ var mishori_count = LastRow_Answered - LastRow;
86
+
87
+ Logger.log(mishori_count)
88
+
89
+
90
+
91
+  //未処理カウントが1以上の場合、これが0になるまで(1になるまで?)繰り返し処理
92
+
93
+ if(mishori_count >0){
94
+
95
+ Logger.log("ifクリア");
96
+
97
+ for(var i = mishori_count; i >=1; i--){
98
+
99
+ Logger.log("ループ実行");
100
+
101
+ var toshibango = DataSheet.getRange(LastRow,1).getValues();
102
+
103
+ var yokonaga = DataSheet.getRange(LastRow-1,42,LastRow-1, 89).getValues();
104
+
105
+
106
+
107
+ DataSheet.getRange(LastRow,1).copyTo(DataSheet.getRange(LastRow+1,1)); //通し番号コピってます
108
+
109
+ DataSheet.getRange(LastRow-1,42,2,48 ).copyTo(DataSheet.getRange(LastRow,42,2, 48));//42列目〜89列目APからCK コピってます。
110
+
111
+ DataSheet.getRange(LastRow+1,104).setValue(new Date());//打刻
112
+
113
+
114
+
115
+ //最終行の回答番号を取得して、開始セルも終了セルもそれにする(つまり1枚のみPDF生成)
116
+
117
+ var LatestAnswer = DataSheet.getRange(LastRow+1,1).getValue();
118
+
119
+ Logger.log(LatestAnswer);
120
+
121
+ ReferenceCell.setValue(LatestAnswer);
122
+
123
+ EndCell.setValue(LatestAnswer);
124
+
125
+
126
+
127
+ ////////////////////
128
+
129
+ //以下、PDF生成から下書き作成まで
130
+
131
+ ////////////////////
132
+
133
+ var yourName = sheet.getRange("K1").getValue();
134
+
135
+ var gmailAddress = sheet.getRange("s3").getValue();
136
+
137
+ var filename = "結果_" + yourName +"様.pdf"
138
+
139
+ createPDF2(driveID, ssID,sheetID, filename); //下の関数を実行
140
+
141
+ createDraft2(gmailAddress, yourName, filename); //下の関数を実行
142
+
143
+
144
+
145
+ LastRow += 1
146
+
147
+ LastRow_Answered += 1
148
+
149
+
150
+
151
+ }
152
+
153
+ }
154
+
155
+ }
156
+
157
+
158
+
159
+
160
+
161
+
162
+
163
+
164
+
165
+
166
+
167
+
168
+
169
+
170
+
171
+
172
+
173
+
174
+
175
+
176
+
177
+
178
+
179
+
180
+
181
+
182
+
183
+
184
+
185
+
186
+
187
+
188
+
189
+
190
+
191
+ function createPDF2(folderid, ssid, sheetid, filename){
192
+
193
+
194
+
195
+ // PDFファイルの保存先となるフォルダをフォルダIDで指定
196
+
197
+ var folder = DriveApp.getFolderById(folderid);
198
+
199
+
200
+
201
+ // スプレッドシートをPDFにエクスポートするためのURL。このURLに色々なオプションを付けてPDFを作成
202
+
203
+ var url = "https://docs.google.com/spreadsheets/d/SSID/export?".replace("SSID", ssid);
204
+
205
+
206
+
207
+ // PDF作成のオプションを指定
208
+
209
+ var opts = {
210
+
211
+ exportFormat: "pdf", // ファイル形式の指定 pdf / csv / xls / xlsx
212
+
213
+ format: "pdf", // ファイル形式の指定 pdf / csv / xls / xlsx
214
+
215
+ size: "A4", // 用紙サイズの指定 legal / letter / A4
216
+
217
+ portrait: "true", // true → 縦向き、false → 横向き
218
+
219
+ fitw: "true", // 幅を用紙に合わせるか
220
+
221
+ sheetnames: "false", // シート名をPDF上部に表示するか
222
+
223
+ printtitle: "false", // スプレッドシート名をPDF上部に表示するか
224
+
225
+ pagenumbers: "false", // ページ番号の有無
226
+
227
+ gridlines: "false", // グリッドラインの表示有無
228
+
229
+ fzr: "false", // 固定行の表示有無
230
+
231
+ gid: sheetid // シートIDを指定 sheetidは引数で取得
232
+
233
+ };
234
+
235
+
236
+
237
+ var url_ext = [];
238
+
239
+
240
+
241
+ // 上記のoptsのオプション名と値を「=」で繋げて配列url_extに格納
242
+
243
+ for( optName in opts ){
244
+
245
+ url_ext.push( optName + "=" + opts[optName] );
246
+
247
+ }
248
+
249
+
250
+
251
+ // url_extの各要素を「&」で繋げる
252
+
253
+ var options = url_ext.join("&");
254
+
255
+
256
+
257
+ // optionsは以下のように作成しても同じです。
258
+
259
+ // var ptions = 'exportFormat=pdf&format=pdf'
260
+
261
+ // + '&size=A4'
262
+
263
+ // + '&portrait=true'
264
+
265
+ // + '&sheetnames=false&printtitle=false'
266
+
267
+ // + '&pagenumbers=false&gridlines=false'
268
+
269
+ // + '&fzr=false'
270
+
271
+ // + '&gid=' + sheetid;
272
+
273
+
274
+
275
+ // API使用のためのOAuth認証
276
+
277
+ var token = ScriptApp.getOAuthToken();
278
+
279
+
280
+
281
+ // PDF作成
282
+
283
+ var response = UrlFetchApp.fetch(url + options, {
284
+
285
+ headers: {
286
+
287
+ 'Authorization': 'Bearer ' + token
288
+
289
+ }
290
+
291
+ });
292
+
293
+
294
+
295
+ //
296
+
297
+ var blob = response.getBlob().setName(filename);
298
+
299
+
300
+
301
+ //}
302
+
303
+
304
+
305
+ // PDFを指定したフォルダに保存
306
+
307
+ folder.createFile(blob);
308
+
309
+ }
310
+
311
+
312
+
313
+
314
+
315
+
316
+
317
+ //////////////////////////////////////////
318
+
319
+ //CREATE DRAFT
320
+
321
+ //////////////////////////////////////////
322
+
323
+
324
+
325
+ function createDraft2(gmailAddress, yourName, filename){
326
+
327
+ //var accessToken = e.messageMetadata.accessToken;
328
+
329
+ //GmailApp.setCurrentMessageAccessToken(accessToken);
330
+
331
+ var attachedPDF = DriveApp.getFilesByName(filename).next();
332
+
333
+ var body = yourName + "様\n" +
334
+
335
+ "\n"+
336
+
337
+ "結果をお送りいたします。\n"+
338
+
339
+ "添付ファイルをご確認くださいませ。\n"+
340
+
341
+ "\n"+
342
+
343
+
344
+
345
+
346
+
347
+ GmailApp.createDraft(gmailAddress, "結果", body,{attachments:[attachedPDF]});
348
+
349
+
350
+
351
+ }
352
+
353
+
354
+
355
+
356
+
357
+
358
+
359
+
360
+
361
+
362
+
363
+
364
+
365
+
366
+
367
+
368
+
369
+
370
+
371
+
372
+
373
+
374
+
375
+
376
+
377
+
378
+
379
+
380
+
381
+
382
+
383
+
384
+
385
+
386
+
387
+
388
+
389
+
390
+
391
+
392
+
393
+
394
+
395
+
396
+
397
+
398
+
399
+
400
+
401
+ ```

1

「フォームが同時に送信されるとエラーになる」という点についての説明詳細を記載致しました。

2020/10/12 06:54

投稿

yoichiyy
yoichiyy

スコア55

test CHANGED
File without changes
test CHANGED
@@ -2,27 +2,25 @@
2
2
 
3
3
  スクリプトが実行されるように設定(「スプレッドシートから フォーム送信時」)しています。
4
4
 
5
- 自動返信を送るスクリプトです。
6
5
 
7
-
8
6
 
9
- フォ同時に信されと、エラーになってしまいます。
7
+ 自動返信メを送るスクリプトです。
10
8
 
11
9
 
12
10
 
13
- これ解決す方法として
11
+ 単にメールだけでなく
14
12
 
13
+ スプレッドシートの値をコピーしたり、
14
+
15
- スクリプトトリガーを、「フォム送信時」ではなく、「5分ごと」にすること検討しました。
15
+ もとにグラフを生成しそれをメ添付したりするもので、
16
+
17
+ 一回あたりの実行時間が5秒程度かかります。
16
18
 
17
19
 
18
20
 
19
- ですが、この方法だと私のアカウントで5分おきにスクリプト実行されることなり
21
+ このスクリプト実行の約5秒間の間に、
20
22
 
21
- あまりにもリソ使いすぎいるではいかと思い躊躇います。
23
+ 次のフォ受信ししまうと、そままエラーにっています。
22
-
23
- *5分おき・・・1日に288回・・・のスクリプト試行が「リソースを使いすぎだ」ということの根拠はないのですが、
24
-
25
- いやいや、何かしらのリソースが各gogoleアカウントには割り当てられており、これはやはり影響があるだろうと予想しました。
26
24
 
27
25
 
28
26