回答編集履歴

9

コメントを受けて追加

2021/05/23 01:54

投稿

退会済みユーザー
test CHANGED
@@ -1,70 +1,282 @@
1
1
  ソースは下記のようになります。(reply()関数)
2
2
 
3
-
3
+ **[05/23 10:40] getSchedTime()関数を追加、reply関数の後半を修正**
4
4
 
5
5
  ※フォームに紐付けたスプレッドシートのメニューの ファイル→「スプレッドシートの設定」で、
6
6
 
7
7
  タイムゾーンを「(GMT+0900) Tokyo」に設定しておくこと)
8
8
 
9
+ ```diff
10
+
11
+
12
+
13
+ function getSchedTime(date, time) {
14
+
15
+ return new Date(
16
+
17
+ Utilities.formatDate(new Date(date), "JST", "yyyy-MM-dd") +
18
+
19
+ " " + Utilities.formatDate(new Date(time), "JST", "HH:mm") + "+09:00"
20
+
21
+ );
22
+
23
+ }
24
+
25
+
26
+
27
+ function reply(data) {
28
+
29
+ var postMsg = data.message.text;
30
+
31
+ var replyToken = data.replyToken;
32
+
33
+ var replyText = "";
34
+
35
+ var userId = data.source.userId;
36
+
37
+
38
+
39
+ if (postMsg == "登録") {
40
+
41
+ // entry.zzzzzzはユーザーIDのフォームフィールドの番号。
42
+
43
+ replyText =
44
+
45
+ "予定の登録はこちら\n" +
46
+
47
+ `https://docs.google.com/forms/d/1XXXXXXXXXX/viewform?usp=pp_url&entry.zzzzzz=${userId}`;
48
+
49
+ } else if (postMsg == "今後の予定") {
50
+
51
+ var spreadsheet = SpreadsheetApp.openById("XXXXXXXXXX");
52
+
53
+ var sheet = spreadsheet.getActiveSheet();
54
+
55
+
56
+
57
+ var today = new Date(Utilities.formatDate(new Date(),"JST", "yyyy-MM-dd 00:00:00+09:00"))
58
+
59
+ // スプレッドシートのデータを一括取得
60
+
61
+ var allRecords = sheet.getRange(2, 1, sheet.getLastRow()-1, 7).getValues();
62
+
63
+ // ユーザID が一致しかつ当日以降のものだけ抽出し、日付順に並び替え。
64
+
65
+ var records = allRecords
66
+
67
+ .filter(e => e[3] == userId && e[2] >= today)
68
+
69
+ .sort((a, b) => getSchedTime(a[2], a[6]) - getSchedTime(b[2], b[6]));
70
+
71
+
72
+
73
+ // 日付をフォーマットし、予定と一緒に配列化。
74
+
75
+ var value = records.map(e => {
76
+
77
+ var date = Utilities.formatDate(new Date(e[2]), "JST", "yyyy/MM/dd");
78
+
79
+ var time = Utilities.formatDate(new Date(e[6]), "JST", "HH:mm");
80
+
81
+ return `・${e[1]} (${date} ${time})\n\n`
82
+
83
+ });
84
+
85
+
86
+
87
+ if (value.length > 0) replyText = value.join("") + "忘れないようにしましょう!";
88
+
89
+ else replyText = "予定がありません。";
90
+
91
+ }
92
+
93
+
94
+
95
+ 【以下略】
96
+
97
+ ```
98
+
99
+
100
+
101
+ # 解説
102
+
103
+ 1.フォームの構造
104
+
105
+
106
+
107
+ フォームの末尾に、ユーザーID格納用の項目を追加します。(赤枠)
108
+
109
+ 項目名は何でも構いません(「編集禁止」という注意書きを付けておいたほうが良いかもしれません)
110
+
111
+ ![イメージ説明](5ca3e587b3a82d456d843f767fcf8fef.jpeg)
112
+
113
+
114
+
115
+
116
+
117
+ ここでフォームの**ユーザーID項目の番号(entry.zzzzzz(数字))**を、Tatsunosukeさんがコメントに記載していただいた
118
+
119
+ https://blog.nakachon.com/2016/12/22/how-to-add-url-parameter-for-google-form/
120
+
121
+ の要領に従ってメモしておきます。
122
+
123
+
124
+
125
+ あとはこの項目番号を、reply()ファンクション内のフォーム呼び出しURLに組み込むことで、
126
+
127
+ LINEのユーザIDがあらかじめ記入されたフォームを呼び出すことが可能になります。
128
+
129
+ (下記の部分です)
130
+
131
+ ```javascript
132
+
133
+
134
+
135
+ var userId = data.source.userId;
136
+
137
+
138
+
139
+ if (postMsg == "登録") {
140
+
141
+ // entry.zzzzzzはユーザーIDのフォームフィールドの番号。
142
+
143
+ replyText =
144
+
145
+ "予定の登録はこちら\n" +
146
+
147
+ `https://docs.google.com/forms/d/1XXXXXXXXXX/viewform?usp=pp_url&entry.zzzzzz=${userId}`;
148
+
149
+ }
150
+
151
+
152
+
153
+ ```
154
+
155
+  
156
+
157
+  
158
+
159
+  
160
+
161
+ 2.先のフォーム画像のように作れば、フォームと紐付きのスプレッドシートの構造はこのようになっているはずです。
162
+
163
+ a列:タイムスタンプ(自動)、b列:入力した予定 c列:入力した日付 d列:ユーザID
164
+
165
+
166
+
167
+ ![イメージ説明](dd1c74e47b226cbc7efe9709189e5ca4.png)
168
+
169
+  
170
+
171
+ スプレッドシートのD列には、LINEから「登録」と打って予定登録フォームを呼び出した時に自動的に付けられたLINEのユーザーIDが入っているわけですから、
172
+
173
+ 予定を呼び出すときは、このIDを元に取捨選択すればよいということになります。
174
+
175
+
176
+
177
+ ```
178
+
179
+ var records = allRecords
180
+
181
+ .filter(e => e[3] == userId && e[2] >= today)
182
+
183
+ .sort(~~略~~)
184
+
185
+
186
+
187
+ ```
188
+
189
+ この「e[3] == userId」の部分が「D列が、その予定を呼び出したユーザーIDと等しいかどうか」を比較している部分になります。
190
+
191
+
192
+
193
+
194
+
195
+ -----
196
+
197
+
198
+
199
+  
200
+
201
+  
202
+
203
+ ・現状の問題点
204
+
205
+ フォーム入力時に、useridを変えられたり削除されたりしてしまうと、上記の仕組みがうまく動きません。
206
+
207
+ →これは、userid項目を隠すことで対応できますが、隠すにはフォームを自作する必要があり、難易度が高いです。
208
+
209
+ 現状、「useridを変えたり消したりすると動作しません」と注意喚起しておく必要があります。
210
+
211
+  
212
+
213
+ -----
214
+
215
+  
216
+
217
+  
218
+
219
+ コメントでの依頼分:当日も含めて表示&時刻追加とのことだったので日付取得部分を下記のように変更しました。
220
+
221
+ (回答前半に記載コードを参照)
222
+
9
223
  ```js
10
224
 
11
-
225
+ // getSchedTime()関数を追加
226
+
227
+ function getSchedTime(date, time) {
228
+
229
+ return new Date(
230
+
231
+ Utilities.formatDate(new Date(date), "JST", "yyyy-MM-dd") +
232
+
233
+ " " + Utilities.formatDate(new Date(time), "JST", "HH:mm") + "+09:00"
234
+
235
+ );
236
+
237
+ }
238
+
239
+
240
+
241
+ //reply関数後半を変更
12
242
 
13
243
  function reply(data) {
14
244
 
15
- var postMsg = data.message.text;
16
-
17
- var replyToken = data.replyToken;
18
-
19
- var replyText = "";
20
-
21
- var userId = data.source.userId;
22
-
23
-
24
-
25
- if (postMsg == "登録") {
26
-
27
- // entry.zzzzzzはユーザーIDのフォームフィールドの番号。
28
-
29
- replyText =
245
+ 【略】
30
-
246
+
31
- "予定の登録はこちら\n" +
247
+ ...
32
-
33
- `https://docs.google.com/forms/d/1XXXXXXXXXX/viewform?usp=pp_url&entry.zzzzzz=${userId}`;
248
+
34
-
35
- } else if (postMsg == "今後の予定") {
36
-
37
- var spreadsheet = SpreadsheetApp.openById("XXXXXXXXXX");
38
-
39
- var sheet = spreadsheet.getActiveSheet();
249
+ ...
40
-
41
-
42
-
43
- var today =new Date(Utilities.formatDate(new Date(),"JST", "yyyy-MM-dd 00:00:00+09:00"))
250
+
44
-
45
- // スプレッドシートのデータを一括取得
251
+ // スプレッドシートのデータを一括取得 (時刻データがある7列目まで取得するように修正)
46
-
252
+
47
- var allRecords = sheet.getRange(2, 1, sheet.getLastRow()-1, 4).getValues();
253
+ var allRecords = sheet.getRange(2, 1, sheet.getLastRow()-1, 7).getValues();
48
254
 
49
255
  // ユーザID が一致しかつ当日以降のものだけ抽出し、日付順に並び替え。
50
256
 
51
257
  var records = allRecords
52
258
 
53
- .filter(e => e[3] == userId && e[2] >= today)
259
+ .filter(e => e[3] == userId && e[2] >= today)
54
-
260
+
55
- .sort((a,b) => a[2] - b[2])
261
+ .sort((a, b) => getSchedTime(a[2], a[6]) - getSchedTime(b[2], b[6]));
56
-
57
-
262
+
263
+
58
264
 
59
265
  // 日付をフォーマットし、予定と一緒に配列化。
60
266
 
61
- var value = records.map(e =>
267
+ var value = records.map(e => {
62
-
268
+
63
- `・${e[1]}(${Utilities.formatDate(e[2], "JST", "yyyy/MM/dd")})\n\n`);
269
+ var date = Utilities.formatDate(new Date(e[2]), "JST", "yyyy/MM/dd");
270
+
64
-
271
+ var time = Utilities.formatDate(new Date(e[6]), "JST", "HH:mm");
272
+
65
-
273
+ return `・${e[1]} (${date} ${time})\n\n`
274
+
66
-
275
+ });
276
+
67
- replyText = value.join("") + "忘れないようにしましょう!";
277
+ if (value.length > 0) replyText = value.join("") + "忘れないようにしましょう!";
278
+
279
+ else replyText = "予定がありません。";
68
280
 
69
281
  }
70
282
 
@@ -72,162 +284,6 @@
72
284
 
73
285
  【以下略】
74
286
 
287
+ ...
288
+
75
- ```
289
+ ```
76
-
77
-
78
-
79
- # 解説
80
-
81
- 1.フォームの構造
82
-
83
-
84
-
85
- フォームの末尾に、ユーザーID格納用の項目を追加します。(赤枠)
86
-
87
- 項目名は何でも構いません(「編集禁止」という注意書きを付けておいたほうが良いかもしれません)
88
-
89
- ![イメージ説明](5ca3e587b3a82d456d843f767fcf8fef.jpeg)
90
-
91
-
92
-
93
-
94
-
95
- ここでフォームの**ユーザーID項目の番号(entry.zzzzzz(数字))**を、Tatsunosukeさんがコメントに記載していただいた
96
-
97
- https://blog.nakachon.com/2016/12/22/how-to-add-url-parameter-for-google-form/
98
-
99
- の要領に従ってメモしておきます。
100
-
101
-
102
-
103
- あとはこの項目番号を、reply()ファンクション内のフォーム呼び出しURLに組み込むことで、
104
-
105
- LINEのユーザIDがあらかじめ記入されたフォームを呼び出すことが可能になります。
106
-
107
- (下記の部分です)
108
-
109
- ```javascript
110
-
111
-
112
-
113
- var userId = data.source.userId;
114
-
115
-
116
-
117
- if (postMsg == "登録") {
118
-
119
- // entry.zzzzzzはユーザーIDのフォームフィールドの番号。
120
-
121
- replyText =
122
-
123
- "予定の登録はこちら\n" +
124
-
125
- `https://docs.google.com/forms/d/1XXXXXXXXXX/viewform?usp=pp_url&entry.zzzzzz=${userId}`;
126
-
127
- }
128
-
129
-
130
-
131
- ```
132
-
133
-  
134
-
135
-  
136
-
137
-  
138
-
139
- 2.先のフォーム画像のように作れば、フォームと紐付きのスプレッドシートの構造はこのようになっているはずです。
140
-
141
- a列:タイムスタンプ(自動)、b列:入力した予定 c列:入力した日付 d列:ユーザID
142
-
143
-
144
-
145
- ![イメージ説明](dd1c74e47b226cbc7efe9709189e5ca4.png)
146
-
147
-  
148
-
149
- スプレッドシートのD列には、LINEから「登録」と打って予定登録フォームを呼び出した時に自動的に付けられたLINEのユーザーIDが入っているわけですから、
150
-
151
- 予定を呼び出すときは、このIDを元に取捨選択すればよいということになります。
152
-
153
-
154
-
155
- ```
156
-
157
- var records = allRecords
158
-
159
- .filter(e => e[3] == userId && e[2] > today)
160
-
161
- .sort((a,b) => a[2] - b[2])
162
-
163
- ```
164
-
165
- この「e => e[3] == userId」の部分が「D列が、その予定を呼び出したユーザーIDと等しいかどうか」を比較している部分になります。
166
-
167
-  
168
-
169
- 元のコードでは、1行1行スプレッドシートにアクセスしており、データが多くなるとスピードが遅くなりそうだったので、
170
-
171
- データをあらかじめ配列に一括格納し、filterとsortを使用して選択・並び替えています。
172
-
173
-
174
-
175
- 予定の文章の組み立て部分もmapを利用してすっきりした形にしてみました。
176
-
177
-
178
-
179
- -----
180
-
181
-
182
-
183
-  
184
-
185
-  
186
-
187
- ・現状の問題点
188
-
189
- フォーム入力時に、useridを変えられたり削除されたりしてしまうと、上記の仕組みがうまく動きません。
190
-
191
- →これは、userid項目を隠すことで対応できますが、隠すにはフォームを自作する必要があり、難易度が高いです。
192
-
193
- 現状、「useridを変えたり消したりすると動作しません」と注意喚起しておく必要があります。
194
-
195
-
196
-
197
-  
198
-
199
- ・今後実装できると面白そうなこと
200
-
201
-   登録済み予定の変更・削除
202
-
203
-   メモ機能
204
-
205
- など
206
-
207
-
208
-
209
- -----
210
-
211
-  
212
-
213
-  
214
-
215
- コメントでの依頼分:当日も含めて表示されるようにとのことだったので日付取得部分を下記のように変更しました。
216
-
217
- ```js
218
-
219
- var today =new Date(Utilities.formatDate(new Date(), "JST", "yyyy-MM-dd 00:00:00+09:00"))
220
-
221
- // スプレッドシートのデータを一括取得
222
-
223
- var allRecords = sheet.getRange(2, 1, sheet.getLastRow()-1, 4).getValues();
224
-
225
- // ユーザID が一致しかつ当日以降(当日含む)の項目だけ抽出し、日付順に並び替え。
226
-
227
- var records = allRecords
228
-
229
- .filter(e => e[3] == userId && e[2] >= today)
230
-
231
- .sort((a,b) => a[2] - b[2])
232
-
233
- ```

8

修正

2021/05/23 01:54

投稿

退会済みユーザー
test CHANGED
@@ -50,7 +50,7 @@
50
50
 
51
51
  var records = allRecords
52
52
 
53
- .filter(e => e[2] >= today)
53
+ .filter(e => e[3] == userId && e[2] >= today)
54
54
 
55
55
  .sort((a,b) => a[2] - b[2])
56
56
 
@@ -226,7 +226,7 @@
226
226
 
227
227
  var records = allRecords
228
228
 
229
- .filter(e => e[2] >= today)
229
+ .filter(e => e[3] == userId && e[2] >= today)
230
230
 
231
231
  .sort((a,b) => a[2] - b[2])
232
232
 

7

2021/05/22 11:49

投稿

退会済みユーザー
test CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
 
4
4
 
5
+ ※フォームに紐付けたスプレッドシートのメニューの ファイル→「スプレッドシートの設定」で、
6
+
7
+ タイムゾーンを「(GMT+0900) Tokyo」に設定しておくこと)
8
+
5
9
  ```js
6
10
 
7
11
 

6

変更

2021/05/22 09:47

投稿

退会済みユーザー
test CHANGED
@@ -1,5 +1,7 @@
1
1
  ソースは下記のようになります。(reply()関数)
2
2
 
3
+
4
+
3
5
  ```js
4
6
 
5
7
 
@@ -34,7 +36,7 @@
34
36
 
35
37
 
36
38
 
37
- var today = new Date();
39
+ var today =new Date(Utilities.formatDate(new Date(),"JST", "yyyy-MM-dd 00:00:00+09:00"))
38
40
 
39
41
  // スプレッドシートのデータを一括取得
40
42
 
@@ -44,156 +46,184 @@
44
46
 
45
47
  var records = allRecords
46
48
 
49
+ .filter(e => e[2] >= today)
50
+
51
+ .sort((a,b) => a[2] - b[2])
52
+
53
+
54
+
55
+ // 日付をフォーマットし、予定と一緒に配列化。
56
+
57
+ var value = records.map(e =>
58
+
59
+ `・${e[1]}(${Utilities.formatDate(e[2], "JST", "yyyy/MM/dd")})\n\n`);
60
+
61
+
62
+
63
+ replyText = value.join("") + "忘れないようにしましょう!";
64
+
65
+ }
66
+
67
+
68
+
69
+ 【以下略】
70
+
71
+ ```
72
+
73
+
74
+
75
+ # 解説
76
+
77
+ 1.フォームの構造
78
+
79
+
80
+
81
+ フォームの末尾に、ユーザーID格納用の項目を追加します。(赤枠)
82
+
83
+ 項目名は何でも構いません(「編集禁止」という注意書きを付けておいたほうが良いかもしれません)
84
+
85
+ ![イメージ説明](5ca3e587b3a82d456d843f767fcf8fef.jpeg)
86
+
87
+
88
+
89
+
90
+
91
+ ここでフォームの**ユーザーID項目の番号(entry.zzzzzz(数字))**を、Tatsunosukeさんがコメントに記載していただいた
92
+
93
+ https://blog.nakachon.com/2016/12/22/how-to-add-url-parameter-for-google-form/
94
+
95
+ の要領に従ってメモしておきます。
96
+
97
+
98
+
99
+ あとはこの項目番号を、reply()ファンクション内のフォーム呼び出しURLに組み込むことで、
100
+
101
+ LINEのユーザIDがあらかじめ記入されたフォームを呼び出すことが可能になります。
102
+
103
+ (下記の部分です)
104
+
105
+ ```javascript
106
+
107
+
108
+
109
+ var userId = data.source.userId;
110
+
111
+
112
+
113
+ if (postMsg == "登録") {
114
+
115
+ // entry.zzzzzzはユーザーIDのフォームフィールドの番号。
116
+
117
+ replyText =
118
+
119
+ "予定の登録はこちら\n" +
120
+
121
+ `https://docs.google.com/forms/d/1XXXXXXXXXX/viewform?usp=pp_url&entry.zzzzzz=${userId}`;
122
+
123
+ }
124
+
125
+
126
+
127
+ ```
128
+
129
+  
130
+
131
+  
132
+
133
+  
134
+
135
+ 2.先のフォーム画像のように作れば、フォームと紐付きのスプレッドシートの構造はこのようになっているはずです。
136
+
137
+ a列:タイムスタンプ(自動)、b列:入力した予定 c列:入力した日付 d列:ユーザID
138
+
139
+
140
+
141
+ ![イメージ説明](dd1c74e47b226cbc7efe9709189e5ca4.png)
142
+
143
+  
144
+
145
+ スプレッドシートのD列には、LINEから「登録」と打って予定登録フォームを呼び出した時に自動的に付けられたLINEのユーザーIDが入っているわけですから、
146
+
147
+ 予定を呼び出すときは、このIDを元に取捨選択すればよいということになります。
148
+
149
+
150
+
151
+ ```
152
+
153
+ var records = allRecords
154
+
47
155
  .filter(e => e[3] == userId && e[2] > today)
48
156
 
49
- .sort((a, b) => a[2] - b[2])
50
-
51
-
52
-
53
- // 日付をフォーマットし、予定と一緒配列化
54
-
55
- var value = records.map(e =>
56
-
57
- `・${e[1]}(${Utilities.formatDate(e[2], "JST", "yyyy/MM/dd")})\n\n`);
58
-
59
-
60
-
61
- replyText = value.join("") + "忘れないようにしましょう!";
62
-
63
- }
64
-
65
-
66
-
67
- 【以下略】
68
-
69
- ```
70
-
71
-
72
-
73
- # 解説
74
-
75
- 1.フォーム構造
76
-
77
-
78
-
79
- フォームの末尾にユーザーID格納用の項目を追加します。(赤枠)
80
-
81
- 項目名は何でも構いません(「編集禁止」という注意書きを付けておいたほう良いかもしれせん)
82
-
83
- ![イメージ説明](5ca3e587b3a82d456d843f767fcf8fef.jpeg)
84
-
85
-
86
-
87
-
88
-
89
- ここでフォーム**ユーザーID項目の番号(entry.zzzzzz(数字))**を、Tatsunosukeさんがコメントに記載していただいた
90
-
91
- https://blog.nakachon.com/2016/12/22/how-to-add-url-parameter-for-google-form/
92
-
93
- の要領に従ってメモしておきます。
94
-
95
-
96
-
97
- あとはこの項目番号を、reply()ファンクション内のフォーム呼び出しURLに組み込むことで、
98
-
99
- LINEのユーザIDがあらかじめ記入されたフォームを呼び出すことが可能になります。
100
-
101
- (下記の部分です)
102
-
103
- ```javascript
104
-
105
-
106
-
107
- var userId = data.source.userId;
108
-
109
-
110
-
111
- if (postMsg == "登録") {
112
-
113
- // entry.zzzzzzはユーザIDのフォームフィールドの番号
114
-
115
- replyText =
116
-
117
- "予定の登録はこちら\n" +
118
-
119
- `https://docs.google.com/forms/d/1XXXXXXXXXX/viewform?usp=pp_url&entry.zzzzzz=${userId}`;
120
-
121
- }
122
-
123
-
124
-
125
- ```
126
-
127
-  
128
-
129
-  
130
-
131
-  
132
-
133
- 2.先のフォーム画像のように作れば、フォームと紐付きのスプレッドシートの構造はこのようになっているはずです。
134
-
135
- a列:タイムスタンプ(自動)、b列:入力した予定 c列:入力した日付 d列:ユーザID
136
-
137
-
138
-
139
- ![イメージ説明](dd1c74e47b226cbc7efe9709189e5ca4.png)
140
-
141
-  
142
-
143
- スプレッドシートのD列には、LINEから「登録」と打って予定登録フォームを呼び出した時に自動的に付けられたLINEのユーザーIDが入っているわけですから、
144
-
145
- 予定を呼び出すときは、このIDを元に取捨選択すればよいということになります。
146
-
147
-
148
-
149
- ```
157
+ .sort((a,b) => a[2] - b[2])
158
+
159
+ ```
160
+
161
+ この「e => e[3] == userId」の部分が「D列がその予定を呼び出したユーザーID等しいかどうか」を比較している部分なります
162
+
163
+  
164
+
165
+ 元のコードでは、1行1行スプレッドシートにアクセスしており、データが多くなるとスピードが遅くなりそうだったので、
166
+
167
+ データをあらかじめ配列に一括格納し、filterとsortを使用して選択・並び替えています。
168
+
169
+
170
+
171
+ 予定の文章の組み立て部分もmapを利用してすっきりした形にしてみました。
172
+
173
+
174
+
175
+ -----
176
+
177
+
178
+
179
+  
180
+
181
+  
182
+
183
+ ・現状問題点
184
+
185
+ フォーム入力時に、useridを変えられたり削除されたりしてしまうと、上記の仕組みがうまく動きません。
186
+
187
+ →これはuserid項目を隠すことで対応できますが、隠すにはフォームを自作する必要があり、難易度が高いです
188
+
189
+ 現状、「useridを変えたり消したりすると動作しません」と注意喚起しておく必要ありす。
190
+
191
+
192
+
193
+  
194
+
195
+ ・今後実装できると面白そうなこと
196
+
197
+   登録済み予定変更・削除
198
+
199
+   メモ機能
200
+
201
+ など
202
+
203
+
204
+
205
+ -----
206
+
207
+  
208
+
209
+  
210
+
211
+ コメントでの依頼分:当日も含めて表示されるようにとのことだったので日付取得部分を下記のように変更しました。
212
+
213
+ ```js
214
+
215
+ var today =new Date(Utilities.formatDate(new Date(), "JST", "yyyy-MM-dd 00:00:00+09:00"))
216
+
217
+ // スプレッドシートのデータを一括取得
218
+
219
+ var allRecords = sheet.getRange(2, 1, sheet.getLastRow()-1, 4).getValues();
220
+
221
+ // ユーザID が一致しかつ当日以降(当日含む)項目だけ抽出し、日付順に並び替え
150
222
 
151
223
  var records = allRecords
152
224
 
153
- .filter(e => e[3] == userId && e[2] > today)
225
+ .filter(e => e[2] >= today)
154
-
226
+
155
- .sort((a,b) => a[2] - b[2])
227
+ .sort((a,b) => a[2] - b[2])
156
-
228
+
157
- ```
229
+ ```
158
-
159
- この「e => e[3] == userId」の部分が「D列が、その予定を呼び出したユーザーIDと等しいかどうか」を比較している部分になります。
160
-
161
-  
162
-
163
- 元のコードでは、1行1行スプレッドシートにアクセスしており、データが多くなるとスピードが遅くなりそうだったので、
164
-
165
- データをあらかじめ配列に一括格納し、filterとsortを使用して選択・並び替えています。
166
-
167
-
168
-
169
- 予定の文章の組み立て部分もmapを利用してすっきりした形にしてみました。
170
-
171
-
172
-
173
- -----
174
-
175
-
176
-
177
-  
178
-
179
-  
180
-
181
- ・現状の問題点
182
-
183
- フォーム入力時に、useridを変えられたり削除されたりしてしまうと、上記の仕組みがうまく動きません。
184
-
185
- →これは、userid項目を隠すことで対応できますが、隠すにはフォームを自作する必要があり、難易度が高いです。
186
-
187
- 現状、「useridを変えたり消したりすると動作しません」と注意喚起しておく必要があります。
188
-
189
-
190
-
191
-  
192
-
193
- ・今後実装できると面白そうなこと
194
-
195
-   登録済み予定の変更・削除
196
-
197
-   メモ機能
198
-
199
- など

5

修正

2021/05/22 09:33

投稿

退会済みユーザー
test CHANGED
@@ -1,4 +1,4 @@
1
- ソースは下記のようになります。(reply()関数
1
+ ソースは下記のようになります。(reply()関数)
2
2
 
3
3
  ```js
4
4
 
@@ -32,9 +32,7 @@
32
32
 
33
33
  var sheet = spreadsheet.getActiveSheet();
34
34
 
35
-
36
-
37
-
35
+
38
36
 
39
37
  var today = new Date();
40
38
 
@@ -48,7 +46,7 @@
48
46
 
49
47
  .filter(e => e[3] == userId && e[2] > today)
50
48
 
51
- .sort((a,b) => a[2] - b[2])
49
+ .sort((a, b) => a[2] - b[2])
52
50
 
53
51
 
54
52
 
@@ -56,7 +54,7 @@
56
54
 
57
55
  var value = records.map(e =>
58
56
 
59
- `・${Utilities.formatDate(e[2], "JST", "yyyy/MM/dd")}(${e[1]})\n\n`);
57
+ `・${e[1]}(${Utilities.formatDate(e[2], "JST", "yyyy/MM/dd")})\n\n`);
60
58
 
61
59
 
62
60
 

4

修正

2021/05/21 16:16

投稿

退会済みユーザー
test CHANGED
@@ -56,7 +56,7 @@
56
56
 
57
57
  var value = records.map(e =>
58
58
 
59
- `・${Utilities.formatDate(e[2], "JST", "yyyy/MM/dd")}(${e[3]})\n\n`);
59
+ `・${Utilities.formatDate(e[2], "JST", "yyyy/MM/dd")}(${e[1]})\n\n`);
60
60
 
61
61
 
62
62
 

3

修正

2021/05/21 16:10

投稿

退会済みユーザー
test CHANGED
@@ -104,6 +104,12 @@
104
104
 
105
105
  ```javascript
106
106
 
107
+
108
+
109
+ var userId = data.source.userId;
110
+
111
+
112
+
107
113
  if (postMsg == "登録") {
108
114
 
109
115
  // entry.zzzzzzはユーザーIDのフォームフィールドの番号。

2

修正

2021/05/21 16:00

投稿

退会済みユーザー
test CHANGED
@@ -24,7 +24,7 @@
24
24
 
25
25
  "予定の登録はこちら\n" +
26
26
 
27
- `https://docs.google.com/forms/d/1XXXXXXXXXX/viewform?entry.zzzzzz=${userId}`;
27
+ `https://docs.google.com/forms/d/1XXXXXXXXXX/viewform?usp=pp_url&entry.zzzzzz=${userId}`;
28
28
 
29
29
  } else if (postMsg == "今後の予定") {
30
30
 
@@ -112,7 +112,7 @@
112
112
 
113
113
  "予定の登録はこちら\n" +
114
114
 
115
- `https://docs.google.com/forms/d/1XXXXXXXXXX/viewform?entry.zzzzzz=${userId}`;
115
+ `https://docs.google.com/forms/d/1XXXXXXXXXX/viewform?usp=pp_url&entry.zzzzzz=${userId}`;
116
116
 
117
117
  }
118
118
 

1

修正

2021/05/21 15:59

投稿

退会済みユーザー
test CHANGED
@@ -46,7 +46,7 @@
46
46
 
47
47
  var records = allRecords
48
48
 
49
- .filter(e => e[3] == userId && e[3] > today)
49
+ .filter(e => e[3] == userId && e[2] > today)
50
50
 
51
51
  .sort((a,b) => a[2] - b[2])
52
52
 
@@ -146,7 +146,7 @@
146
146
 
147
147
  var records = allRecords
148
148
 
149
- .filter(e => e[3] == userId && e[3] > today)
149
+ .filter(e => e[3] == userId && e[2] > today)
150
150
 
151
151
  .sort((a,b) => a[2] - b[2])
152
152