質問: strSei + " " + strMei+"様 ●●●●●●●●"; //姓 名 様 メールタイトル var strFrom="/*Mailadress*/"; //From var strSender="/*Name*/"; //差出人 /* メールを送信 */ MailApp.sendEmail( strEmail, //toアドレス strSubject, //メールタイトル strBody, //本文 { from: strFrom, //fromアドレス name: strSender //差出人 } ); } } ```
回答: * `var rowSheet = mySheet.getDataRange().getLastRow();` ikedas様が回答で引用された仕様のとおりなので、冗長です。`var rowShet = myShet.getLastRow();`とすべきです。 * ロジックにより、ループが1回多くなる理由(今回はあてはまらないように見えるので参考程度に) 手続型プログラミングでありがちなのは、forの終了条件の判定で、不等号でイコールを含むかどうかを誤っているパターン。これに対処するには、そもそもforをしない、という選択を考えるべきです。具体的にはArray.prototype.forEachを利用するなどをご検討ください。 * 今回の1回多い理由と対処 ロジック上の誤りには見えないので、データ起因です。つまり回答は自分で探すしかないです。そこで探しかた。 どうやってループが1回多いと思ったかが疑問です。MailAppは、宛先が不正だとエラーになるので、仮にA列が空白だったら、メールは送信されないため(その後の実行も中断する)ので気付けないはず(例えばAからC列は5行しかデータがないのに、F6にタイプミスなどで文字があるときには、A6が空白なので、メール送信エラーで結局5通しか送信できない。あり得ないが送信できたとして、空白の宛先なので誰も知りようがない)。 仮に、メールのあてさきや姓、名が同じものが2通来たことを根拠に判定しているとしても、それは行が非表示になっているなどして見えないだけで、ループが1回多いかどうか分からないはず。 さらに、この2つの組み合わせとして、質問者様は3行と思っているのに、getLastRowは6を取得し、5行目のA列がないため、1回しか多くないようにみえてるパターンもあり得ます。 などと考えると、gasが取得しているrowSheetやそれぞれの都度のstrEmailなどをLogger.logして見ていくほか原因も対処法も不明です (一般論として、strEmailなどが`""`だったらbreak/continueするというのは対処としてなくはないですが、メールが2通来ているパターンは対処できません) * A列の最終行を知りたい場合 A,B,Cはペアなのでこれだけでは上手くいきませんが、A列にあるデータの個数(スプレッドシート関数で言うCOUNTA(A:A))は、下記のように取得できます。ただし、こちらはCOUNTA相当なので、途中にA列にデータがない行があると、A列のデータがある最終行を取得できない(足りなくなる)ので、ご注意ください。 ``` function getLastRowOfA(sheet) { return sheet.getRange("A:A").getValues().filter(String).length; //"A:C"とやっても動かないのでご注意ください } ```