teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

修正

2021/05/21 15:34

投稿

Tatsunosuke
Tatsunosuke

スコア599

answer CHANGED
@@ -15,7 +15,7 @@
15
15
  var replyText = "";
16
16
 
17
17
    if(postMsg == "登録") {
18
-   replyText = "予定の登録はこちら\n" + "https://docs.google.com/forms/d/e/***/viewform?entry.***=userId";
18
+   replyText = "予定の登録はこちら\n" + "https://docs.google.com/forms/d/e/***/viewform?entry.***="+userId;
19
19
  //↑フォームIDとエントリーの番号を入力
20
20
  } ...
21
21
  ```

3

追記

2021/05/21 15:34

投稿

Tatsunosuke
Tatsunosuke

スコア599

answer CHANGED
@@ -1,5 +1,31 @@
1
1
  [追記]
2
+ 横から口出しのようになってしまいすみません。
2
3
 
4
+ ①googleフォームにユーザIDという欄を作成する。
5
+ ②「登録」に対してのリプライで、googleフォームのURLを返す際にentryでユーザIDを入力する。
6
+ ※ユーザIDは、以下で取得可能。
7
+
8
+
9
+ ```gas
10
+ function reply(data) {
11
+ var postMsg = data.message.text;
12
+ var replyToken = data.replyToken;
13
+    // ユーザID
14
+    var userId = data.source.userId
15
+ var replyText = "";
16
+
17
+   if(postMsg == "登録") {
18
+   replyText = "予定の登録はこちら\n" + "https://docs.google.com/forms/d/e/***/viewform?entry.***=userId";
19
+ //↑フォームIDとエントリーの番号を入力
20
+ } ...
21
+ ```
22
+
23
+
24
+ ---
25
+
26
+
27
+ [追記]
28
+
3
29
  ①follow時に、ユーザIDに適当な英数字を(認証コード)割り当て、メッセージで予め送っておき、ユーザIDと共にSSに保存しておく。
4
30
 
5
31
  ②GOOGLEフォーム側に認証コードを入力してもらう。

2

追記

2021/05/21 15:05

投稿

Tatsunosuke
Tatsunosuke

スコア599

answer CHANGED
@@ -1,3 +1,29 @@
1
+ [追記]
2
+
3
+ ①follow時に、ユーザIDに適当な英数字を(認証コード)割り当て、メッセージで予め送っておき、ユーザIDと共にSSに保存しておく。
4
+
5
+ ②GOOGLEフォーム側に認証コードを入力してもらう。
6
+ メールアドレスの収集を有効にする。
7
+ ※google workspaceメンバーは自動で入力されますが、無料GOOGLEeアカウントだと手入力なのでちょっと面倒かも。。。
8
+
9
+ ※認証コード用のフォームと予定入力用は分けてもいいと思います。
10
+ =>初めての方用
11
+ メールアドレスと認証コードを取得。認証コードと紐付いているユーザIDとメールアドレスを紐付ける。
12
+
13
+ =>予定入力用
14
+ メールアドレスを入力してもらい、ユーザIDを検索する。
15
+
16
+
17
+ になりますかね。。。
18
+
19
+
20
+ もっと簡単にしたいとなると、GOOGLEフォームは色々と制限があり使いにくいのでVUEなどを使って自分でフォームを作っちゃた方が早くて高性能でかっこよく作れます。
21
+ 学習コストがちょっとかかりますが。。。
22
+
23
+ 検討ください!
24
+
25
+ ---
26
+
1
27
  トラブルなかったようでよかったです!
2
28
  まず先にお詫びですが、GASではLINEのメッセージAPIを使用したことはありませんので、
3
29
  最後までいけるか若干不安はありますが。。。

1

追記

2021/05/21 14:21

投稿

Tatsunosuke
Tatsunosuke

スコア599

answer CHANGED
@@ -6,17 +6,67 @@
6
6
 
7
7
 
8
8
  SS = スプレッドシート
9
- 今回のコードでは、
9
+
10
10
  ①メッセージの送信
11
11
  ②フォロー時に、SSに保存されているユーザIDの保存
12
12
  ③アンフォロー時に、SSに保存されているユーザIDの削除
13
13
 
14
- それぞれは理解できていますか?
14
+ これはそれぞれは理解できていますか?
15
- 問題なければOKです。
15
+ できていればOKです。
16
16
 
17
17
  > このようなプログラムを見よう見まねで作成したのですが、予定を表示させたときに、複数人の予定が纏めて表示されてしまいました。
18
18
  そこで、BOTを追加した人ごとにスプレッドシートを作成して別々に内容を管理したいと考えたのですが行き詰ってしまいました。
19
19
 
20
20
 
21
21
  ここが悩みということですよね?
22
+
23
+ ④ユーザIDとGOOGLEフォームから投稿された内容を送る「誰か」を紐づける。
22
- まず、GOOGLEフォームから投稿された内容が誰に当ててなのか、LIN
24
+ まず、GOOGLEフォームから投稿された内容が誰か」に送るためには
25
+ その[誰]とLINEユーザIDを紐づけるさせる必要があります。
26
+
27
+ 紐づけるにはfollow時に、ユーザIDに適当な英数字を割り当て(ユニークId)メッセージで予め送っておき、ユーザIDと共にSSに保存しておき、ユーザ側にはGOOGLEフォーム入力時にユニークIDを入力してもらう。
28
+
29
+ GOOGLEフォーム
30
+ 例)メッセージパスワードを入力してください。 [A8ga3df]
31
+
32
+ ⑤予定を返す
33
+ 今後の予定と入力があった場合に予定を返すこととなりますが、
34
+ ここは簡単だと思います。
35
+ 詳細なコードは割愛しますが、
36
+ 1.全てのデータの取得
37
+ 2.ユニークIdを持った行を見つける
38
+ 3.2の中の日付が未来のものだけ返す
39
+
40
+ という3つの作業になります。
41
+
42
+
43
+
44
+ ```gas
45
+ function reply(data) {
46
+ var postMsg = data.message.text;
47
+ var replyToken = data.replyToken;
48
+ var replyText = "";
49
+
50
+ if(postMsg == "登録") {
51
+ replyText = "予定の登録はこちら\n" + "https://docs.google.com/forms/d/XXXXXXXXXX/edit#responses";
52
+ } else if(postMsg == "今後の予定") {
53
+ var spreadsheet = SpreadsheetApp.openById("XXXXXXXXXX");
54
+ var sheet = spreadsheet.getActiveSheet();
55
+
56
+    //ここに記載
57
+     
58
+
59
+  
60
+ }
61
+ ```
62
+
63
+ GASやJSは日付の比較や操作が面倒なのでライブラリを入れることをお勧めします。
64
+ [DAYJS](https://gas.excelspeedup.com/dayjs/)
65
+
66
+
67
+
68
+ 言っている意味が難しいと感じるようであれば、
69
+ まずは焦らずfor文やif分、getValues,setValues、配列と二次元配列、連想配列を自由に使いこなせるように
70
+ なってから進めた方が最終的には早く完成すると思います。
71
+
72
+ 頑張ってください!!応援してます!!