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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

2448閲覧

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

bibibi-jj

総合スコア9

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

1クリップ

投稿2020/06/09 09:37

編集2020/06/10 03:01

前提・実現したいこと

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(というよりプログラム的な事)は全くの素人で調べながらでの作業となります。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

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

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

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

Utilities.sleep(1000);

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

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

投稿2020/06/10 08:22

sawa

総合スコア3002

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bibibi-jj

2020/06/11 10:08 編集

早々にご回答いただきありがとうございます! Utilities.sleep(5000); こちらのコードを挿入して、今のところ思い通りになっております! (ミリ秒ということで5秒(5000)で設定しました) 時間も運用しつつ調整していこうと思います。 for文前に挿入しても問題なく作動しました。 シート読み込み前がいいのかな、と思いvar sheet の前に入れてみましたが、こちらも正常に動いています。 タイムラグはちょっと脳裏にあり、仰る通り、シート側に書けば解決するのだろうなと思っていました。 実は以前シート側にコードを書いて運用していたのですが、1送信なのにメール通知が複数届く現象が頻繁に発生しており、どうやらGoogle側の不具合のようでフォーム側にコードを書くことでその現象はなくなる、ということでした。 実際にフォーム側にすることで、複数のメールが送信という現象はなくなりました。 その際は、以下記事辺りを参考にしました。 https://teratail.com/questions/174338 フォーム側記載に変更して1年ほど経過しているので、またシート側に記載してテスト運用してみようと思います。 この度は本当に助かりました。 どうもありがとうございます!
sawa

2020/06/11 12:55

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

2020/06/11 23:59

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問