質問編集履歴

2

実際に入力したコードを書きました。

2020/10/14 03:32

投稿

ookk
ookk

スコア0

test CHANGED
File without changes
test CHANGED
@@ -242,7 +242,7 @@
242
242
 
243
243
  //「https://docs.google.com/spreadsheets/d/xxx/edit」のxxxを入れてください
244
244
 
245
- var spreadSheetID = '1KiDd0tKJcVLB6dyzznNd4KWVKH31rjYy4bGBV1frzmQ';
245
+ var spreadSheetID = 'xxx';
246
246
 
247
247
 
248
248
 

1

実際に入力したコードを書きました。

2020/10/14 03:32

投稿

ookk
ookk

スコア0

test CHANGED
File without changes
test CHANGED
@@ -12,4 +12,432 @@
12
12
 
13
13
 
14
14
 
15
- https://qiita.com/GMA/items/e672c18b09d84c753973 このリンクの方法で,定員のある選択肢を1つ作ることはできました。
15
+ https://qiita.com/GMA/items/e672c18b09d84c753973 このリンクの方法を2個ならべました。選択肢の作成・更新は,2問ともきましたが,定員のある選択肢とはなっていませんでした。
16
+
17
+ スプレッドシートには,シートを分けて,「フォームの回答」「候補A」「候補B」を作りました。
18
+
19
+
20
+
21
+
22
+
23
+ ////
24
+
25
+ // 【基本設定】
26
+
27
+ // ここを編集するだけで使用できます
28
+
29
+ ////
30
+
31
+
32
+
33
+ //「https://docs.google.com/spreadsheets/d/xxx/edit」のxxxを入れてください
34
+
35
+ var spreadSheetID = 'xxx';
36
+
37
+
38
+
39
+ // 候補日と定員を書くシート名
40
+
41
+ var sheetName = '候補A';
42
+
43
+
44
+
45
+ // 回答のシート名
46
+
47
+ var answerSheetName = 'フォームの回答';
48
+
49
+
50
+
51
+ // 定員のある項目の名前
52
+
53
+ var questionName = 'Aの利用希望(各日定員50名です。)';
54
+
55
+
56
+
57
+ ////
58
+
59
+ // 【フォームを更新する関数】
60
+
61
+ ////
62
+
63
+ function updateForm(){
64
+
65
+ ////
66
+
67
+ // 【スプレッドシートの情報を取得】
68
+
69
+ // 候補と定員を取得し、定員に満たない候補のみを取得します
70
+
71
+ ////
72
+
73
+
74
+
75
+ // スプレッドシートをIDで取得
76
+
77
+ var sheets = SpreadsheetApp.openById(spreadSheetID);
78
+
79
+
80
+
81
+ // 候補と回答のシートを取得
82
+
83
+ var sheet = sheets.getSheetByName(sheetName);
84
+
85
+ var answerSheet = sheets.getSheetByName(answerSheetName);
86
+
87
+
88
+
89
+ // 候補のシートのA行の2行目から下の値を配列で取得する
90
+
91
+ var sheetLastRow = sheet.getLastRow();
92
+
93
+ if (sheetLastRow > 1) {
94
+
95
+ // 候補と定員を取得
96
+
97
+ var candidate = sheet.getRange(2, 1, sheetLastRow - 1, 2).getValues();
98
+
99
+ } else {
100
+
101
+ return;
102
+
103
+ }
104
+
105
+
106
+
107
+ // 回答のシートの2行目から下の値を配列で取得する
108
+
109
+ var answerSheetLastRow = answerSheet.getLastRow();
110
+
111
+ if (answerSheetLastRow > 1) {
112
+
113
+ var questionNames = answerSheet.getRange(1, 1, 1, answerSheet.getLastColumn()).getValues();
114
+
115
+ var colCount = questionNames[0].indexOf(questionName);
116
+
117
+ // 必要な部分だけ取得
118
+
119
+ var answerData = answerSheet.getRange(2, colCount + 1, answerSheetLastRow - 1).getValues();
120
+
121
+ }
122
+
123
+
124
+
125
+ ////
126
+
127
+ // 【Googleフォームの選択肢の上書き】
128
+
129
+ ////
130
+
131
+
132
+
133
+ // フォームの取得
134
+
135
+ var form = FormApp.getActiveForm();
136
+
137
+
138
+
139
+ // 質問項目をすべて取得
140
+
141
+ var items = form.getItems();
142
+
143
+
144
+
145
+ // 選択肢の作成、更新
146
+
147
+ items.forEach(function(item){
148
+
149
+ // 質問項目がquestionNameの項目を探す
150
+
151
+ if(item.getTitle() === questionName){
152
+
153
+ var listItemQuestion = item.asListItem();
154
+
155
+ // 選択肢を入れる配列
156
+
157
+ var choices = [];
158
+
159
+
160
+
161
+ // 候補日を一つ一つ見ていく
162
+
163
+ // nameAndCapacity[0]が候補日、nameAndCapacity[1]がその定員
164
+
165
+ candidate.forEach(function(nameAndCapacity){
166
+
167
+ if(nameAndCapacity[0] != ""){
168
+
169
+ // 定員無制限かどうか。また、回答が一件もない場合もこっち
170
+
171
+ if (answerData == null || nameAndCapacity[1] == 0 || nameAndCapacity[1] == ""){
172
+
173
+ choices.push(listItemQuestion.createChoice(nameAndCapacity[0]));
174
+
175
+ } else {
176
+
177
+ // 定員がある場合は定員以上になっていないか確認
178
+
179
+ var counter = 0;
180
+
181
+ // 何人分キャパが埋まっているかカウント
182
+
183
+ for(var i = 0; i < answerData.length; i++){
184
+
185
+ if (nameAndCapacity[0] == answerData[i]){
186
+
187
+ counter++;
188
+
189
+ }
190
+
191
+ }
192
+
193
+ // まだキャパがあれば選択肢に追加
194
+
195
+ if (counter < nameAndCapacity[1]){
196
+
197
+ choices.push(listItemQuestion.createChoice(nameAndCapacity[0]));
198
+
199
+ }
200
+
201
+ }
202
+
203
+ }
204
+
205
+ });
206
+
207
+
208
+
209
+ if (choices.length > 0) {
210
+
211
+ // フォームの回答を受け付ける
212
+
213
+ form.setAcceptingResponses(true);
214
+
215
+ // 選択肢を上書き
216
+
217
+ listItemQuestion.setChoices(choices);
218
+
219
+ } else {
220
+
221
+ // 満員につき、回答受付終了
222
+
223
+ form.setAcceptingResponses(false);
224
+
225
+ }
226
+
227
+ return;
228
+
229
+ }
230
+
231
+ });
232
+
233
+ }////
234
+
235
+ // 【基本設定(2問目の質問)】
236
+
237
+ //
238
+
239
+ ////
240
+
241
+
242
+
243
+ //「https://docs.google.com/spreadsheets/d/xxx/edit」のxxxを入れてください
244
+
245
+ var spreadSheetID = '1KiDd0tKJcVLB6dyzznNd4KWVKH31rjYy4bGBV1frzmQ';
246
+
247
+
248
+
249
+ // 候補日と定員を書くシート名
250
+
251
+ var sheetName2 = '候補B';
252
+
253
+
254
+
255
+ // 回答のシート名
256
+
257
+ var answerSheetName = 'フォームの回答';
258
+
259
+
260
+
261
+ // 定員のある項目の名前
262
+
263
+ var questionName2 = 'Bの利用希望(各日定員30名です。)';
264
+
265
+
266
+
267
+ ////
268
+
269
+ // 【フォームを更新する関数】
270
+
271
+ ////
272
+
273
+ function updateForm(){
274
+
275
+ ////
276
+
277
+ // 【スプレッドシートの情報を取得】
278
+
279
+ // 候補と定員を取得し、定員に満たない候補のみを取得します
280
+
281
+ ////
282
+
283
+
284
+
285
+ // スプレッドシートをIDで取得
286
+
287
+ var sheets = SpreadsheetApp.openById(spreadSheetID);
288
+
289
+
290
+
291
+ // 候補と回答のシートを取得
292
+
293
+ var sheet2 = sheets.getSheetByName(sheetName2); //「Sheet2」とした
294
+
295
+ var answerSheet = sheets.getSheetByName(answerSheetName);
296
+
297
+
298
+
299
+ // 候補のシートのA行の2行目から下の値を配列で取得する
300
+
301
+ var sheetLastRow = sheet2.getLastRow();    //「Sheet2」とした
302
+
303
+ if (sheetLastRow > 1) {
304
+
305
+ // 候補と定員を取得
306
+
307
+ var candidate = sheet2.getRange(2, 1, sheetLastRow - 1, 2).getValues();   //「Sheet2」とした
308
+
309
+ } else {
310
+
311
+ return;
312
+
313
+ }
314
+
315
+
316
+
317
+ // 回答のシートの2行目から下の値を配列で取得する
318
+
319
+ var answerSheetLastRow = answerSheet.getLastRow();
320
+
321
+ if (answerSheetLastRow > 1) {
322
+
323
+ var questionNames = answerSheet.getRange(1, 1, 1, answerSheet.getLastColumn()).getValues();
324
+
325
+ var colCount = questionNames[0].indexOf(questionName);
326
+
327
+ // 必要な部分だけ取得
328
+
329
+ var answerData = answerSheet.getRange(2, colCount + 1, answerSheetLastRow - 1).getValues();
330
+
331
+ }
332
+
333
+
334
+
335
+ ////
336
+
337
+ // 【Googleフォームの選択肢の上書き】
338
+
339
+ ////
340
+
341
+
342
+
343
+ // フォームの取得
344
+
345
+ var form = FormApp.getActiveForm();
346
+
347
+
348
+
349
+ // 質問項目をすべて取得
350
+
351
+ var items = form.getItems();
352
+
353
+
354
+
355
+ // 選択肢の作成、更新
356
+
357
+ items.forEach(function(item){
358
+
359
+ // 質問項目がquestionNameの項目を探す
360
+
361
+ if(item.getTitle() === questionName2){   //「questionName2」とした
362
+
363
+ var listItemQuestion = item.asListItem();
364
+
365
+ // 選択肢を入れる配列
366
+
367
+ var choices = [];
368
+
369
+
370
+
371
+ // 候補日を一つ一つ見ていく
372
+
373
+ // nameAndCapacity[0]が候補日、nameAndCapacity[1]がその定員
374
+
375
+ candidate.forEach(function(nameAndCapacity){
376
+
377
+ if(nameAndCapacity[0] != ""){
378
+
379
+ // 定員無制限かどうか。また、回答が一件もない場合もこっち
380
+
381
+ if (answerData == null || nameAndCapacity[1] == 0 || nameAndCapacity[1] == ""){
382
+
383
+ choices.push(listItemQuestion.createChoice(nameAndCapacity[0]));
384
+
385
+ } else {
386
+
387
+ // 定員がある場合は定員以上になっていないか確認
388
+
389
+ var counter = 0;
390
+
391
+ // 何人分キャパが埋まっているかカウント
392
+
393
+ for(var i = 0; i < answerData.length; i++){
394
+
395
+ if (nameAndCapacity[0] == answerData[i]){
396
+
397
+ counter++;
398
+
399
+ }
400
+
401
+ }
402
+
403
+ // まだキャパがあれば選択肢に追加
404
+
405
+ if (counter < nameAndCapacity[1]){
406
+
407
+ choices.push(listItemQuestion.createChoice(nameAndCapacity[0]));
408
+
409
+ }
410
+
411
+ }
412
+
413
+ }
414
+
415
+ });
416
+
417
+
418
+
419
+ if (choices.length > 0) {
420
+
421
+ // フォームの回答を受け付ける
422
+
423
+ form.setAcceptingResponses(true);
424
+
425
+ // 選択肢を上書き
426
+
427
+ listItemQuestion.setChoices(choices);
428
+
429
+ } else {
430
+
431
+ // 満員につき、回答受付終了
432
+
433
+ form.setAcceptingResponses(false);
434
+
435
+ }
436
+
437
+ return;
438
+
439
+ }
440
+
441
+ });
442
+
443
+ }