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

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

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

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

Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Q&A

0回答

1511閲覧

GAS:メール送信したら自分にも届いてしまいます(ThuderBird)

wave_wrider

総合スコア10

Google スプレッドシート

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

Google ドライブ

Google ドライブは、Google社が提供するオンラインストレージサービス。オンラインストレージ上に、画像や動画、テキスト、Word/PDFのファイルなどさまざまなファイル保存することができます。また、他のユーザーと共有することも可能です。

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

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

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

0グッド

1クリップ

投稿2021/10/29 00:45

前提・実現したいこと

社内で共有する取引先リストに対し、一斉メール配信をするツールをつくりたい。

利用者:Workspace内のユーザー限定
メールアプリ:GmailよりもThunderBirdの方が利用者が多い

利用イメージ:
ブラウザ(Edge or Chrome)にWorkspaceアカウントでログインしている状態
該当のスプレッドシートを開く
実行手順をSTEP毎に小分けしたシートを追いながら順に指定する

0.配信アカウントの指定(ログインユーザーか、noreplyかを選択)
1.配信先をチェックボックスで指定(別管理のリストを自動取得)
2.メール件名・本文を編集(宛先名、配信者名はFor文とreplaceで処理)
3.リンクから共有フォルダ(Googleドライブ)に添付ファイルを(あれば)保存
4.「送信ボタン」をクリック→宛先毎に個別に差し込み送信
(送信後)
5.4のシートに配信ログを記録(日時、利用者、件名、配信先数、配信先明細)
6.バックアップ用に利用者宛に同内容のメール+pdf化した配信先リストを送信
7.共有フォルダをクリア

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

送信したメールと同じメールが、ツールの利用者にも送信される。
(宛先にも送信はされています)

4人で検証した結果、ThunderBird利用者のみに?見受けられる現象
(Gmailでは発生していない。EdgeかChromeかは関係が無い様子)

該当のソースコード

GAS

1function send_email() { 2 3 //⓪GAS実行許可権限の確認 4 let riyosya_list = []; 5 let list_ss = SpreadsheetApp.openById('配信先リストのID').getSheetByName('recipient_list'); 6 let all_list_lastrow = list_ss.getLastRow() - 1; 7 let all_list = list_ss.getRange(2, 1, all_list_lastrow, 5).getValues(); 8 9 for (i = 0; i <= all_list.length - 1; i++) { 10 if ((all_list[i][1]) == '利用者可能者リストから抽出' || (all_list[i][1]) == '利用者可能者リストから抽出') { 11 riyosya_list.push([all_list[i][0], all_list[i][2], all_list[i][3]]); 12 } 13 } 14 15 //ファイルにアクセスしているGoogleユーザーのメールアドレスを取得する 16 var activeUser = Session.getActiveUser().getEmail(); 17 18 Logger.log('実行者アドレス:' + activeUser); 19 20 let riyosya_name = []; 21 let riyosya_category = []; 22 23 for (k = 0; k <= riyosya_list.length - 1; k++) { 24 if (riyosya_list[k][0] == activeUser) { 25 riyosya_category = riyosya_list[k][1]; 26 riyosya_name = riyosya_list[k][2]; 27 } 28 } 29 30 Logger.log('実行者 所属・氏名:' + riyosya_category + ' ' + riyosya_name); 31 32 //許可されていない場合、GASを終了する 33 if (riyosya_list.includes(activeUser) == -1) { 34 Browser.msgBox("あなたには実行権限がありません。"); 35 return; 36 } 37 38 // ①配信先をリスト化 39 let recipient_list = []; 40 let ss = SpreadsheetApp.getActiveSpreadsheet(); 41 let haishinsaki_sheet = ss.getSheetByName('①配信先test用'); 42 let recipient_lastrow = haishinsaki_sheet.getLastRow() - 1; 43 let filterd_list = haishinsaki_sheet.getRange(2, 1, recipient_lastrow, 6).getValues(); 44 Logger.log(filterd_list); 45 46 let ichiji_sheet = ss.getSheetByName('■配信先■'); 47 ichiji_sheet.showSheet(); 48 49 let recipient_concate = []; 50 51 for (i = 0; i <= recipient_lastrow - 1; i++) { 52 if (filterd_list[i][0] == true) { 53 recipient_list.push([filterd_list[i][1], filterd_list[i][2], filterd_list[i][3], filterd_list[i][4], filterd_list[i][5]]); 54 let ichiji_lastrow = ichiji_sheet.getLastRow(); 55 ichiji_sheet.getRange(ichiji_lastrow + 1, 1).setValue(filterd_list[i][2]); 56 ichiji_sheet.getRange(ichiji_lastrow + 1, 2).setValue(filterd_list[i][3]); 57 ichiji_sheet.getRange(ichiji_lastrow + 1, 3).setValue(filterd_list[i][4]); 58 ichiji_sheet.getRange(ichiji_lastrow + 1, 4).setValue(filterd_list[i][5]); 59 ichiji_sheet.getRange(ichiji_lastrow + 1, 5).setValue(filterd_list[i][1]); 60 61 recipient_concate = recipient_concate + '【' + filterd_list[i][2] + ':' + filterd_list[i][4] + '】'; 62 } 63 } 64 // ichiji_sheet.autoResizeColumns(1, 5); 65 66 Logger.log('配信先:' + recipient_list); 67 Logger.log('配信先記録用:' + recipient_concate); 68 69 // ②メールタイトルと本文を取得・ドキュメントに反映 70 const doc = DocumentApp.openById('メール本文用ドキュメントのID'); 71 72 let last_text = doc.getBody(); 73 last_text.clear(); 74 75 let text_template = ss.getSheetByName('②本文'); 76 let title_text = text_template.getRange(1, 1, 1, 1).getValue(); 77 78 Logger.log('【 件名 】' + title_text); 79 80 let template_lastrow = text_template.getLastRow(); 81 82 let text_body = doc.getBody(); 83 84 for (i = 2; i <= template_lastrow; i++) { 85 let text_content = text_template.getRange(i, 1, 1, 1).getValue(); 86 text_body.appendParagraph(text_content); 87 } 88 // ②本文フッターの追加 89 let footer_template = ss.getSheetByName('②本文 フッター'); 90 footer_template.showSheet(); 91 let footer_lastrow = footer_template.getLastRow(); 92 for (i = 1; i <= footer_lastrow; i++) { 93 let footer_content = footer_template.getRange(i, 1, 1, 1).getValue(); 94 text_body.appendParagraph(footer_content); 95 } 96 footer_template.hideSheet(); 97 98 Logger.log('本文を更新しました') 99 100 101 // ③添付ファイルを指定 102 103 let attached_files = []; 104 let zantei_files = []; 105 const attached_folder = DriveApp.getFolderById('共有フォルダのID'); 106 const files = attached_folder.getFiles(); 107 while (files.hasNext()) { 108 const file = files.next(); 109 try { 110 const blob = DriveApp.getFileById(file.getId()).getBlob(); 111 attached_files.push(blob); 112 Logger.log(file.getName() + ' を添付しました。'); 113 file.setTrashed(true); 114 Logger.log(file.getName() +' をフォルダから削除しました。') 115 } catch (err) { 116 Logger.log(err.toString()); 117 } 118 } 119 120 // ④宛先毎に送信 121 122 if (ss.getSheetByName('⓪配信名義').getRange(3, 3).getValue() == true) { 123 124 for (let i = 0; i <= recipient_list.length - 1; i++) { 125 126 let strEmail = recipient_list[i][0];//email 127 let strCompany = recipient_list[i][1];//社名 128 let strStore = recipient_list[i][2];//店名 129 let strName = recipient_list[i][3];//個人名 130 let strPosition = recipient_list[i][4];//役職名 131 let strBody = text_body.getText().replace(/{会社}/g, strCompany).replace(/{店名}/g, strStore).replace(/{名前}/g, strName).replace(/{役職}/g, strPosition).replace(/{部署}/g, riyosya_category).replace(/{発信者名}/g, riyosya_name); 132 133 /*メール表題、fromアドレス、差出人名を準備 */ 134 let strSubject = strName + ' 様 ' + title_text; 135 136 let options = { 137 attachments: attached_files, 138 name: riyosya_name, 139 }; 140 141 GmailApp.sendEmail( 142 strEmail, 143 strSubject, 144 strBody, 145 options); 146 Logger.log(riyosya_name + ' から '+ strName + ' さんへ送信完了') 147 } 148 } else { 149 for (let i = 0; i <= recipient_list.length - 1; i++) { 150 151 let strEmail = recipient_list[i][0];//email 152 let strCompany = recipient_list[i][1];//社名 153 let strStore = recipient_list[i][2];//店名 154 let strName = recipient_list[i][3];//個人名 155 let strPosition = recipient_list[i][4];//役職名 156 let strBody = text_body.getText().replace(/{会社}/g, strCompany).replace(/{店名}/g, strStore).replace(/{名前}/g, strName).replace(/{役職}/g, strPosition).replace(/{部署}/g, riyosya_category).replace(/{発信者名}/g, riyosya_name); 157 158 /*メール表題、fromアドレス、差出人名を準備 */ 159 let strSubject = strName + ' 様 ' + title_text; 160 161 let options = { 162 noReply: true, 163 attachments: attached_files, 164 name: '弊社名', 165 }; 166 167 GmailApp.sendEmail( 168 strEmail, 169 strSubject, 170 strBody, 171 options); 172 Logger.log(riyosya_name + ' から '+ strName + ' さんへ送信完了') 173 } 174 175 } 176 Logger.log('配信を全件完了しました'); 177 178 // ⑤送信者へバックアップ用を送る(送信リストをpdfで添付ファイルに追加) 179 let key = ss.getId(); 180 let sendlog_id = ichiji_sheet.getSheetId(); 181 let token = ScriptApp.getOAuthToken(); 182 let url = "https://docs.google.com/spreadsheets/d/" + key + "/export?gid=" + sendlog_id + "&format=pdf&portrait=true&size=A4&gridlines=true&fitw=true"; 183 let sendlog_report = UrlFetchApp.fetch(url, { headers: { 'Authorization': 'Bearer ' + token } }).getBlob().setName("配信先一覧.pdf"); 184 attached_files.push(sendlog_report); 185 186 options = { attachments: attached_files }; 187 188 let recipient = activeUser; 189 let subject = '★記録用★ ' + title_text; 190 let body = text_body.getText().replace('{部署}', riyosya_category).replace('{発信者名}', riyosya_name).replace('担当:', ""); 191 192 GmailApp.sendEmail(recipient, subject, body, options); 193 194 Logger.log('自分にバックアップを送りました'); 195 ichiji_sheet.hideSheet(); 196 197 // ④+ 利用記録に記入 198 let today = new Date(); 199 200 let log_sheet = ss.getSheetByName('④送信・利用記録'); 201 let log_lastrow = log_sheet.getLastRow(); 202 log_sheet.getRange(log_lastrow + 1, 1).setValue(today); 203 log_sheet.getRange(log_lastrow + 1, 3).setValue(title_text); 204 log_sheet.getRange(log_lastrow + 1, 4).setValue(recipient_list.length); 205 log_sheet.getRange(log_lastrow + 1, 5).setValue(recipient_concate); 206 if (ss.getSheetByName('⓪配信名義').getRange(3, 3).getValue() == true) { 207 log_sheet.getRange(log_lastrow + 1, 2).setValue(riyosya_name); 208 } else { 209 log_sheet.getRange(log_lastrow + 1, 2).setValue(activeUser); 210 } 211 Logger.log('利用記録に記入しました'); 212 213 // ⑥件名、本文、■配信先■、添付ファイルをクリア 214 text_template.getRange(1, 1).clearContent(); 215 text_template.getRange(7, 1, template_lastrow - 6, 1).clearContent(); 216 Logger.log('件名・本文をクリアしました'); 217 text_template.getRange(1, 1).setValue('(ここに件名を記入してください)'); 218 text_template.getRange(8, 1).setValue('(ここに本文を記入してください)'); 219 ichiji_sheet.getRange(2, 1, ichiji_sheet.getLastRow() - 1, 5).clear(); 220 Logger.log('配信リストをクリアしました'); 221 222 // const delete_files = attached_folder.getFiles(); 223 // while (delete_files.hasNext()) { 224 // const delete_file = delete_files.next().setTrashed(true); 225 // Logger.log(delete_file + ' を添付用フォルダから削除しました。') 226 // } 227 Browser.msgBox('一斉送信処理および保管用メールの送信が完了しました。\n\nメールソフトの送受信履歴を確認してください。\n\nThunderbirdをお使いの方は、送信分のメールも受信しますので適宜、削除してください。'); 228 Logger.log('一斉送信処理が完了しました。'); 229}

試したこと

何度読み返してもGmail以外なら「自分にも送る」ロジックが見当たりませんでした。。。

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

テスト環境は以下の通りです
1.Chrome + Gmail・・・問題無し(1人)
2.Chrome + ThuderBird・・・上記の問題アリ(1人)
3.Edge + Gmail・・・テストケース無し
4.Edge + ThuderBird・・・上記の問題アリ(2人)

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

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

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

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

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

macaron_xxx

2021/11/03 23:33

>送信したメールと同じメールが、ツールの利用者にも送信される。 これは受信者としてメールが届いていますか? 送信履歴としてThunderBirdに転送されているだけのような気がしますが。。
wave_wrider

2021/11/04 01:47

ご確認ありがとうございます。 「宛先アドレス:配信先、送信者アドレス:利用者、本文:配信先様 〇〇の件です~」が利用者の受信トレイに届きます。 ThuderBirdを使うWorkspaceアカウントがGASでメールを送信すると ThuderBird受信トレイに「送信履歴」が届く、という仕様なのでしょうか。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問