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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

Q&A

解決済

1回答

1205閲覧

GASスクルプトで実行するとなぜかメールが多く配信される。

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Google

Googleは、アメリカ合衆国に位置する、インターネット関連のサービスや製品を提供している企業です。検索エンジンからアプリケーションの提供まで、多岐にわたるサービスを提供しています。

0グッド

0クリップ

投稿2020/10/18 10:14

編集2020/10/18 20:28

以下のスクリプトを実行すると何故か、最後に一致する人にだけ2個メールを送ってしまいます。
何かこの書き方に間違えがあるのでしょうか。
自分ではどこに問題があるかわかりません。
宜しくお願いします。

GAS

1function sendAllMail() { 2 // このスクリプトの実行日の取得 3 var today = Utilities.formatDate(new Date(), 'Asia/Tokyo','yyyy/MM/dd');; // 今日の日付をyyyy/mm/dd形式に直して取得 4 5 // spreadSheetオブジェクトを取得 6 let spreadSheet = SpreadsheetApp.getActive() 7 8 // 件名と本文が書かれたsheetオブジェクトを取得 9 let templateSheet = spreadSheet.getSheetByName("データ項目") 10 11 // 件名はD2セルに入ってるのでその値を取得 12 let title = templateSheet.getRange("D2").getValue() 13 14 // 送信対象のメールアドレス一覧が記載されてるシートを取得 15 let sheet = spreadSheet.getSheetByName("回答") 16 17 var col = "A"; 18 var last_row = sheet.getLastRow(); 19 var range = sheet.getRange(col + "1:" + col + last_row); 20 var value = range.getValues(); 21 var array = []; 22 var isDate = []; 23 24 for(var i = 0; i < value.length; i++){ 25 array.push(value[i][0]); 26 isDate.push(Object.prototype.toString.call(value[i][0])) 27 if (value[i] !== undefined && isDate[i] === "[object Date]"){ 28 array[i] = Utilities.formatDate(array[i], 'Asia/Tokyo','yyyy/MM/dd'); 29 if (array[i] == today){ 30 let targets = sheet.getRange(i+1, 3, i, 5).getValues() 31 32 // 本文の「%企業名%」を企業名に置き換えてメールを送信 33 try { 34 for (target of targets) { 35 var fileurls = target[4].split('/'); 36 var fileid = fileurls[5]; 37 var file = DriveApp.getFileById(fileid);//添付ファイル取得 38 // 本文はB2セルに入ってるのでその値を取得 39 let body = templateSheet.getRange("E2").getValue() 40 body = body.replace(/%名前%/, target[0]) 41 42 // スプレッドシートのメアド、件名・本文でメールを送信 43 GmailApp.sendEmail(target[1], title, body, {attachments: [file]}); 44 } 45 } 46 catch (e) { 47 continue; 48 } 49 } 50 } 51 } 52 } 53

回答シート以下
|タイムスタンプ|受付番号|名前|メールアドレス|性別|年代||
|:--:|:--:|:--:|:--:|:--:|:--:|
|2020/10/18 19:37:14|1|a|aaa@yahoo.co.jp|男|5059歳|https://drive.google.com/file/d/xxxx/view?usp=drivesdk|
|||||||
|2020/10/15 10:09:00|2|c|bbb@yahoo.co.jp|女|30
39歳| https://drive.google.com/file/d/xxx/view?usp=drivesdk|
|||||||
|||||||
|||||||
|2020/10/19 20:34:44|3|d|ccc@gmail.com|男|4049歳|https://drive.google.com/file/d/xxx/view?usp=drivesdk|
|2020/10/17 10:09:07|7|e|ddd@yahoo.co.jp|男|50
59歳| https://drive.google.com/file/d/xxx/view?usp=drivesdk|
|2020/10/19 20:04:04|46|f|eee@gmail.com|男|40~49歳| https://drive.google.com/file/d/xxx/view?usp=drivesdk|

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

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

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

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

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

Daregada

2020/10/18 13:58

「回答」シートのサンプルを質問文に載せてください。
退会済みユーザー

退会済みユーザー

2020/10/18 20:29

失礼しました。 回答シート追加しました。
guest

回答1

0

ベストアンサー

提示されたコードでは、A列の日付のリストをvar value = range.getValues();で取得し、それに基づくforループの内部で、日付が今日と一致した場合にだけlet targets = sheet.getRange(i + 1, 3, i, 5).getValues();でターゲット情報を取得しています。

getRangeがこの形式で4つの引数を取る場合、先頭から順番に、

  • 範囲先頭の行番号(1オリジン)
  • 範囲先頭の列番号(1オリジン)
  • 範囲の行数
  • 範囲の列数

を指定します。

あなたのコードでは、(ターゲット情報を1行だけ取得すればいいのにもかかわらず)、iの値の行数だけの複数のターゲット情報を取得し、それらを順番に処理していますね。そうすると、先頭の日付が今日でなくても、今日の日付の下にあるターゲット情報が使われてしまいます。

forによるループは、A列の日付のリストに関する処理だけにして、今日の日付と一致した場合だけ、1行だけのターゲット情報をその都度取得すればいいでしょう。

なお、今日の日付に一致するターゲットが多数ある場合には、日付リストと同様にgetValuesでターゲット情報のリストをあらかじめ作成しておき、それを使った方が処理が軽くなります。

GAS

1function myFunction() { 2 // 今日の日付文字列(yyyy/MM/dd)を取得 3 var today = Utilities.formatDate(new Date(), 'Asia/Tokyo','yyyy/MM/dd'); 4 Logger.log(`toray: ${today}`); 5 6 // テンプレートと宛先リストの各シートを取得 7 let spreadSheet = SpreadsheetApp.getActive() 8 let templateSheet = spreadSheet.getSheetByName("データ項目") 9 let sheet = spreadSheet.getSheetByName("回答") 10 11 // テンプレートシートから共通タイトルと本文テンプレートを取得 12 let title = templateSheet.getRange("D2").getValue() 13 Logger.log(`title: '${title}'`); 14 let body_template = templateSheet.getRange("E2").getValue(); 15 Logger.log(`body_template: '${body_template}'`); 16 17 // 宛先リストから日付(A列)だけのリストを取得 18 let a1note = `A2:A${sheet.getLastRow()}`; 19 Logger.log(`a1note: ${a1note}`); 20 let date_values = sheet.getRange(a1note).getValues(); 21 Logger.log(`date_values: ${date_values}`); 22 23 for (let i = 0; i < date_values.length; i++) { 24 Logger.log(`loop: ${i}`); 25 26 if (date_values[i] === undefined || Object.prototype.toString.call(date_values[i][0]) !== "[object Date]") { 27 Logger.log("skipped"); 28 continue; 29 } 30 31 // 日付リストから日付文字列(yyyy/MM/dd)を取得 32 let target_date = Utilities.formatDate(date_values[i][0], 'Asia/Tokyo','yyyy/MM/dd'); 33 Logger.log(`target_date: ${target_date}`); 34 35 // 今日の日付文字列と一致するものだけを処理 36 if (target_date === today) { 37 Logger.log("matched"); 38 39 // 行番号は i + 2, 列番号は3(C列)から、「1行・5列分のデータ」(名前、メールアドレスなど)を取得する 40 // getValuesの返り値は2次元配列になるので、先頭の要素(1行分の配列)だけを取り出す 41 let target_values = sheet.getRange(i + 2, 3, 1, 5).getValues()[0]; 42 43 // URLを分割してfileidを取得し、ファイルグロブ情報を得る 44 let fileid = target_values[4].split('/')[5]; 45 let attached_file = DriveApp.getFileById(fileid); 46 47 let target_name = target_values[0]; 48 let target_address = target_values[1]; 49 50 // 本文のテンプレートから実際の本文を生成 51 let body = body_template.replace(/%名前%/, target_name); 52 53 Logger.log(`To: ${target_address}, Subject: ${title}, Body: ${body}, Attachments: ${fileid}`); 54 55 GmailApp.sendEmail(target_address, title, body, {attachments: [attached_file]}); 56 } 57 } 58}

投稿2020/10/19 01:40

Daregada

総合スコア11990

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

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

退会済みユーザー

退会済みユーザー

2020/10/19 03:28

ご丁寧な説明ありがとうございました。 理解できまし。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問