質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.77%

「Googleフォーム」から送信された内容を「LINEのトークルーム(userid宛)」に返信する処理において、複数端末で「Googleフォーム」の送信ボタンを同時押ししたときに、1つの端末に他の端末

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 190

MasakiTM

score 108

「Googleフォーム」から送信された内容を「LINEのトークルーム(userid宛)」に返信する処理において、複数端末で「Googleフォーム」の送信ボタンを同時押ししたときに、1つの端末に他の端末の送信内容が届いてしまう。送信された端末確実に届けるようにしたい。

タイトルの件について以下のような操作を行いたいです。
1.GoogleフォームにLINEのユーザーID格納 //ここは別のスクリプトでうまくいっています。
2.Googleフォームで各入力項目を入力し送信
3.Googleフォームのスクリプトのトリガー「送信時」で下記のソースコードで動作する

[動作内容]
Googleフォームからのメール送信及びLINEトークルームへの返信

そして、以下のような想定しない動作が発生しています。
1.複数ユーザーがGoogleフォームを同時送信
2.Googleフォームを送信した特定1人のLINEトークルームに他の人の内容が返ってしまう。
ソースコードの誤っている点をご教授いただければ助かります。

発生している問題・エラーメッセージ

該当のソースコード

var data = SpreadsheetApp.openById("スプレッドシートID").getSheetByName("スプレッドシートのシート名");

function sendform(e){
  var items = e.response.getItemResponses(); //Googleフォームの内容格納

  //Googleフォームの内容を取り出していく
  var msg = '';
  for (var i = 0; i < items.length; i++) {
    var item = items[i];
    var q = item.getItem().getTitle(); //Googleフォームの質問のタイトル
    var a = item.getResponse(); //Googleフォームの質問の回答
    msg += q + ': ' + a + '\n'; //タイトルと回答を全て取得し整形

    //【LINEの宛先格納】Googleフォームの回答でタイトルが"UserID"であればその回答の"UserID(LINEの宛先)"を取り出し、スクリプトのプロパティに"key"として格納
    if(q=="UserID"){
      var u = a;
      PropertiesService.getScriptProperties().setProperty("key",a);
    }

  }

    //まず指定のメールアドレスにGoogleフォームの送信内容を送信する
    var to = 'メールアドレス';
    GmailApp.sendEmail(to, 'タイトル', msg);


      //LINEトークルームには"UserID"なしで整形しなおしたメッセージを返信
      var msgn = '';
       for (var i = 0; i < items.length; i++) {
        var itemn = items[i];
        var v = itemn.getItem().getTitle();
         if(v=="UserID"){
          continue; //Googleフォームの質問のタイトルが"UserID"であればcontinueで省略
        } 
        var w = itemn.getResponse();
        msgn += v + ': ' + w + '\n\n';
    }

    //①【LINEの返信メッセージ格納】Googleフォームの質問の"UserID"を省略した返信メッセージ作成しスクリプトのプロパティ"msgnm"へ格納
    PropertiesService.getScriptProperties().setProperty("msgnm",msgn);

  //LINEトークルームへ返信(返信する関数は以下参照)
    createMessage();
}

////メッセージ返信
var access_token = "アクセストークン"

function createMessage() {

//スクリプトのプロパティ"msgnm"を参照し、messageへ格納
message = "メッセージ色々"+PropertiesService.getScriptProperties().getProperty("msgnm");

return push(message);
}
//実際にメッセージを送信する関数を作成します。
function push(text) {
  var url = "https://api.line.me/v2/bot/message/push";
  var headers = {
    "Content-Type" : "application/json; charset=UTF-8",
    'Authorization': 'Bearer ' + access_token,
  };

 //宛先をスクリプトのプロパティ"key"とする。
  var to = PropertiesService.getScriptProperties().getProperty("key");
  var postData = {
    "to" : to,
    "messages" : [
      {
        'type':'text',
        'text':text,
      }
    ]
  };

  var options = {
    "method" : "post",
    "headers" : headers,
    "payload" : JSON.stringify(postData)
  };

  return UrlFetchApp.fetch(url, options);
}

試したこと

補足情報(FW/ツールのバージョンなど)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

スクリプトプロパティはセッションを跨いでアクセスする必要がある共有情報(LINEのアクセストークン等)を保存するところです。
基本的にはあらかじめ手動で値を設定しておくか、初期化等で最初の1回だけセットするだけで毎回書き換えるのは使い方を間違っています。

セッション間でも共有しているため、タイミングによって処理中にスクリプトプロパティの情報が他のセッションに書き換えられる可能性はあります。必要な情報は関数の引数で引き渡すようにしましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/18 13:44

    ご回答ありがとうございます。
    こんなイメージで挑戦してみます。。初心者なもので^^;
    大きく間違ってる場合はご指摘ください。。。

    function sendform(e){
    .............

    return ( u, msgn );
    }

    var b = sendform(u);
    var c = sendform(msgn);


    function createMessage(b,c) {

    var d = b;
    var e = c;
    .......

    キャンセル

  • 2020/06/18 19:39

    わかりませでした、、別で質問します

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • トップ
  • Google Apps Scriptに関する質問
  • 「Googleフォーム」から送信された内容を「LINEのトークルーム(userid宛)」に返信する処理において、複数端末で「Googleフォーム」の送信ボタンを同時押ししたときに、1つの端末に他の端末