質問編集履歴

1

内容の追記

2019/08/14 09:39

投稿

ueshima900
ueshima900

スコア27

test CHANGED
File without changes
test CHANGED
@@ -33,3 +33,253 @@
33
33
 
34
34
 
35
35
  よろしくお願いいたします。
36
+
37
+
38
+
39
+
40
+
41
+ ---追記いたします。
42
+
43
+
44
+
45
+
46
+
47
+ var ROOM_MAXIM = 3; // 日程ごとの最大人数
48
+
49
+ var ARY_CHOICE_VAL = ["1/1 10:00〜","1/1 13:00〜","1/1 15:00〜","1/1 17:00〜","1/1 19:00〜",
50
+
51
+ "1/2 10:00〜","1/2 13:00〜","1/2 15:00〜","1/2 17:00〜","1/2 17:00"]
52
+
53
+ var CHOICE_LENGTH = ARY_CHOICE_VAL.length; // 選択肢の数
54
+
55
+ var TMP_NEW_CHOICE_VAL = "全日程満員です。次の設問で希望の日程を入力してください"; // 通常選択肢が全て無くなった後に追加する選択肢VALUE
56
+
57
+ var STR_TARGET_TITLE = "希望日"; // 処理の対象とする質問タイトル名
58
+
59
+
60
+
61
+ var TARGET_CHOICE_VAL = ["1/1 10:00〜","1/1 17:00〜","1/2 10:00〜"] //この配列内のアイテムは1件で質問を消す
62
+
63
+
64
+
65
+ /**
66
+
67
+ * フォーム送信時イベント(初期処理)
68
+
69
+ */
70
+
71
+ function onSend(e) {
72
+
73
+ reBuildItem(e.response.getItemResponses()); //functionの引数eからイベント発生時の回答時のレスポンス取得して受け渡し
74
+
75
+ }
76
+
77
+
78
+
79
+ /**
80
+
81
+ * 選択肢の再構築
82
+
83
+ *
84
+
85
+ * @param {array} 選択肢ごとの回答カウントデータ配列
86
+
87
+ */
88
+
89
+ function reBuildItem(rAnswer) {
90
+
91
+ var form = FormApp.getActiveForm(); //アクティブなformオブジェクトを取得
92
+
93
+ var items = form.getItems(); // フォームのUI項目を取得
94
+
95
+ var allAnswer = getAnswer(); // 全回答の取得
96
+
97
+ Logger.log(allAnswer)
98
+
99
+ // 今回の回答を取得(※プルダウンUIで未選択の場合は回答データに含まれない模様です※)
100
+
101
+ var nowAnswerVal = rAnswer[0].getResponse();
102
+
103
+ Logger.log(nowAnswerVal)
104
+
105
+ var nowAnswerTitle = rAnswer[0].getItem().getTitle();
106
+
107
+
108
+
109
+ if (nowAnswerTitle == STR_TARGET_TITLE) { // 「希望日程」プルダウンで未選択の場合は何もしない(項目タイトルで判断)
110
+
111
+
112
+
113
+ for (var i = 0; i < items.length; i++) { // UI項目分ループ
114
+
115
+ var item = items[i];
116
+
117
+ var itemTitle = String(item.getTitle());
118
+
119
+ var itemType = String(item.getType()); // UI項目のタイプ
120
+
121
+
122
+
123
+ if (itemType == "LIST" && itemTitle == STR_TARGET_TITLE) { // リストボックスかつ項目タイトルが対象の場合
124
+
125
+ var choiceArray = [];
126
+
127
+ var arrayCount = 0
128
+
129
+ var flgChoiceNone = false; // 回答突き合わせ後選択肢が残るか否かのフラグ
130
+
131
+
132
+
133
+ for (var j = 0; j < CHOICE_LENGTH; j++) { // リスト選択肢分ループ
134
+
135
+ var choiceVal = ARY_CHOICE_VAL[j];
136
+
137
+ var flgSet = false; // 上限内か否かのフラグ
138
+
139
+
140
+
141
+ if (flgChoiceNone == false) { // 選択肢がまだ残っている場合
142
+
143
+ if (j == 0 && nowAnswerVal == TMP_NEW_CHOICE_VAL) { // 選択肢が全て無くなった後の追加選択肢のチェックはスルーする
144
+
145
+ flgChoiceNone = true;
146
+
147
+ } else {
148
+
149
+ if (allAnswer[j] < ROOM_MAXIM || allAnswer[3] == ROOM_MAXIM_EXC) { // 回答上限チェック ここで特定の値
150
+
151
+ flgSet = true;
152
+
153
+
154
+
155
+ }
156
+
157
+ }
158
+
159
+ }
160
+
161
+ if (flgSet == true) { // 回答上限に達してない選択肢は退避
162
+
163
+ choiceArray[arrayCount] = choiceVal;
164
+
165
+ arrayCount++;
166
+
167
+ } else {
168
+
169
+ if (choiceVal == nowAnswerVal) { // 今回の回答だった場合
170
+
171
+ Logger.log('上限に達した');
172
+
173
+ }
174
+
175
+ }
176
+
177
+ }
178
+
179
+
180
+
181
+ if (arrayCount == 0) { // 選択肢が全てなくなった場合
182
+
183
+ choiceArray[arrayCount] = TMP_NEW_CHOICE_VAL; // 追加選択肢をセット
184
+
185
+ }
186
+
187
+ // リストボックス作り直し
188
+
189
+ item.asListItem().setChoiceValues(choiceArray);
190
+
191
+ }
192
+
193
+ }
194
+
195
+ }
196
+
197
+ }
198
+
199
+
200
+
201
+
202
+
203
+
204
+
205
+
206
+
207
+ /**
208
+
209
+ * 回答データの取得
210
+
211
+ * 回答データが取得できない(例外の場合)エラースロー
212
+
213
+ *
214
+
215
+ * @return {array} 選択肢ごとの回答カウントデータ配列
216
+
217
+ */
218
+
219
+ function getAnswer() {
220
+
221
+ var form = FormApp.getActiveForm();
222
+
223
+ var formResponses = form.getResponses(); // 全回答内容を取得
224
+
225
+ var aryAnswerCount = []; // 選択肢分配列定義
226
+
227
+ for (var k = 0; k < CHOICE_LENGTH; k++) { // 配列をゼロで初期化(fillメソッド使えないので)
228
+
229
+ aryAnswerCount[k] = 0;
230
+
231
+ }
232
+
233
+ var flgAnswer = false;
234
+
235
+
236
+
237
+ for (var i = 0; i < formResponses.length; i++) {
238
+
239
+ flgAnswer = true;
240
+
241
+ var formResponse = formResponses[i]; // 回答ひとつ分を取得
242
+
243
+ var itemResponses = formResponse.getItemResponses(); // 質問項目を取得
244
+
245
+
246
+
247
+ for (var j = 0; j < itemResponses.length; j++) { // 回答内容をひとつずつチェック
248
+
249
+ var itemResponse = itemResponses[j];
250
+
251
+ var question = itemResponse.getItem().getTitle();
252
+
253
+ var answer = itemResponse.getResponse();
254
+
255
+
256
+
257
+ if (question == STR_TARGET_TITLE) { // 項目タイトルが対象の場合
258
+
259
+ var x = ARY_CHOICE_VAL.indexOf(answer);
260
+
261
+ if (x != -1) { // 選択肢ごとに回答数カウント
262
+
263
+ aryAnswerCount[x]++;
264
+
265
+ }
266
+
267
+ }
268
+
269
+ }
270
+
271
+ }
272
+
273
+
274
+
275
+ if (flgAnswer == false) { // 例外:回答がまだなければエラー吐いて終了
276
+
277
+ throw new Error("not Answer");
278
+
279
+ } else {
280
+
281
+ return aryAnswerCount;
282
+
283
+ }
284
+
285
+ }