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

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

ただいまの
回答率

87.34%

GAS:フォームのメール通知に表示する最終行番号の取得が重複またはズレる

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,669

score 7

前提・実現したいこと

Googleフォームに入力された内容をメール送信するようにしています。(GASはフォーム側に記載しています)
その際、フォーム内容が記録されているスプレッドシートの行番(最終行)を案件番号として件名とメール本文内に記載しています。

件名:フォームの件名固定/No.XX
「XX」に自動的に最終行番号が入る。

A列に自動的にフォーム送信時のタイムスタンプが入り、B列以降はフォームの項目内容が入ります。
最終列は空白の場合もあります。

SSに記録された行(最終行)を案件番号として振り分けています。
フォームの記録が見出し込みで5行目の場合は「No.5」としたいです。

ですが、この最終行番号が重複したり、番号が飛んだり、マイナス1少なくなったりしており、正確な最終行番号の取得が行えていません。

ですが、とりあえず番号は入った状態メール通知はされている状態です。

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

特になし。最終行番号が正常に取得できません。

5行目、6行目の内容がどちらもNo.5になる、7行目の内容がNo.5になる、5行目の内容がNo.4になり6行目の内容がNo.5になったり等。
単純に最終行番号取得でよいので、-1の設定はなし。

該当のソースコード

function submitForm(e){
  var itemResponses = e.response.getItemResponses();
  var timestamp = e.response.getTimestamp(); //問合せ日時
  var date = Utilities.formatDate(timestamp, 'Asia/Tokyo', "YYYY'年'MM'月'dd'日' HH:mm:ss"); //問合せ日時
  var message = ''; //投稿内容部分
  var to = e.response.getRespondentEmail();//to

  //アドレス指定
  var admin_name ="送信者名";//送信メールの名前 
  var admin = "aaa@hoge.jp"; // 先程作成したアドレスに書換
  var cc = admin + "";
  var bcc = "kanrisha@hoge.jp";// bccがいらない場合は、adminを""に書換
  var reply = admin;
  var sheet = SpreadsheetApp.openById("xxxxxxxxxxxスプレッドシートIDxxxxxxxxx").getSheetByName("シート名") // スプレッドシートの操作


  //フォーム取得
  for (var i = 0; i < itemResponses.length; i++) {
    var itemResponse = itemResponses[i];
    var question = itemResponse.getItem().getTitle();
    var answer = itemResponse.getResponse();  
    var id = sheet.getLastRow(); 

試したこと

getLastRowでシート全体の最終行取得でどうにかなると思いましたが、うまくいかなないのでgetRangeも併用したりしましたがうまく動きませんでした。
テスト投稿した際の行はスプレッドシートから削除していたりするのでそれも起因しているのかな…と思いました。

挿入場所が悪いのかと思い、var id = sheet.getLastRow(); をvar sheetの下にしたりもしましたが、同様の現象が発生します。

補足情報

GAS(というよりプログラム的な事)は全くの素人で調べながらでの作業となります。

よろしくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

これは フォームから回答先のスプレッドシートへの反映にタイムラグがあるので仕方ないです。

シートの最終行を取得するのが、回答がスプレッドシートに反映される前だったり、後だったりで、現在の問題が発生しているのかと思われます。

回避策としては、ベストは フォーム側でなくスプレッドシート側でコード書いて、フォーム送信時のトリガーで メール送信させる。

■ちょうどそんな感じの質問に回答しましたので参考に
https://teratail.com/questions/269078

書き直すのが面倒ってことなら、 for文の前あたりに

Utilities.sleep(1000);

あたりを入れて10秒ほど待ってから処理って方法も。

少しは不具合は緩和されるかもですが、反映のタイムラグはGoogleさんの混み具合?次第なとこがあるので、何秒まてば大丈夫というのはなくお勧めはしません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/06/11 19:06 編集

    早々にご回答いただきありがとうございます!

    Utilities.sleep(5000);
    こちらのコードを挿入して、今のところ思い通りになっております!
    (ミリ秒ということで5秒(5000)で設定しました)
    時間も運用しつつ調整していこうと思います。

    for文前に挿入しても問題なく作動しました。
    シート読み込み前がいいのかな、と思いvar sheet の前に入れてみましたが、こちらも正常に動いています。

    タイムラグはちょっと脳裏にあり、仰る通り、シート側に書けば解決するのだろうなと思っていました。
    実は以前シート側にコードを書いて運用していたのですが、1送信なのにメール通知が複数届く現象が頻繁に発生しており、どうやらGoogle側の不具合のようでフォーム側にコードを書くことでその現象はなくなる、ということでした。
    実際にフォーム側にすることで、複数のメールが送信という現象はなくなりました。

    その際は、以下記事辺りを参考にしました。

    https://teratail.com/questions/174338

    フォーム側記載に変更して1年ほど経過しているので、またシート側に記載してテスト運用してみようと思います。

    この度は本当に助かりました。
    どうもありがとうございます!

    キャンセル

  • 2020/06/11 21:55

    ありゃ。桁間違って1秒待ちのコードを10秒って書いちゃいましたね。失礼しました。
    シート側で書く際は、getLastRow()でなく、私が回答でリンクを貼ったような書き方 e.range で回答の行を指定って方法を試してみてください。正確な検証はしてませんが、こっちの方が問題なく動いた印象。

    キャンセル

  • 2020/06/12 08:59

    承知しました!
    試してみたいと思います。
    またお世話になるかもしれませんが、ありがとうございました。

    キャンセル

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

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

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