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

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

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

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

Q&A

3回答

839閲覧

GASで年賀状一斉送信アプリを作りたい

Ichiro51

総合スコア12

Google Apps Script

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

0グッド

0クリップ

投稿2021/01/11 04:27

前提・実現したいこと

GASでドキュメントに記載した内容をスプレッドシートにある連絡先へメール一斉送信したいです。

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

構文エラー: SyntaxError: Invalid or unexpected token 行: 8 ファイル: テスト.gs

該当のソースコード

GAS

1function sendMail(){ 2 const sheet = SpreadsheetApp.getActiveSheet(); 3 const lastRow = 100; 4 sheet.getLastRow(); 5 const values = sheet.getRange(1, 1, lastRow, 4).getValues(); 6 const doc = DocumentApp.openById('ドキュメントのID'); 7 const docText = doc.getBody().getText(); 8 const subject = ‘test test’; //メールの件名 9 const senderName = {name: ‘test’}; //差出人名 10 for(let i = 1; i < lastRow; i++){ 11 const company = values[i][0]; //会社名 12 const lastName = values[i][1]; //姓 13 const firstName = values[i][2]; //名 14 const mailAddress = values[i][3]; //アドレス 15 const body = docText 16 .replace(‘{会社名}’,company) 17 .replace(‘{姓}’,lastName); 18 GmailApp.sendEmail(mailAddress, subject, body, senderName); 19 } 20}

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

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

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

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

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

guest

回答3

0

javascript

1const q315241 = () => { 2 const templateDocumentId = '1DWu0Ji5eW9XCATYbHtcVEUGlptyzjmkdRz04X8xHg'; 3 const subject = '件名'; 4 const sendOption = {name:'わたし'}; 5 const variables = [["{会社名}","A"],["{姓}","B"],["{名}","C"],["{mail address do not replace}","D"]]; //変換するものが何列にあるか。Z列までしか対応していない。メールアドレスは末尾 6 7 const columns = variables.map(e=>[e[0],alphaToPos(e[1])]); 8 const list = SpreadsheetApp.getActiveSheet().getDataRange().getValues(); 9 const bodyTemplate = DocumentApp.openById(templateDocumentId).getBody().getText(); 10 list.filter(r=>columns.map(e=>r[e[1]]).every(e=>e !== "")).forEach(r=>{ 11 const body = columns.reduce((a,c)=> a.replace(c[0],r[c[1]]),bodyTemplate); 12 GmailApp.sendEmail(r[r.length - 1], subject, body, sendOption); 13 }) 14} 15const alphaToPos = (c) => "ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(c);

投稿2021/01/12 15:57

papinianus

総合スコア12705

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

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

0

const senderName = {name: ‘test’}; //差出人名 ↓ const senderName = {name: 'test'}; //差出人名

シングルクォートが全角になってます。(他の箇所も)

投稿2021/01/11 04:46

編集2021/01/11 04:47
umau

総合スコア805

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

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

Ichiro51

2021/01/11 05:23

ありがとうございます!その部分は修正できました。 今度は以下で、SpreadsheetにはA列名前、B列メールアドレスにしているんですが、”エラー Exception: Failed to send email: no recipient”と表示されてしまいます。。 function sendMail(){ const sheet = SpreadsheetApp.getActiveSheet(); const lastRow = 100; sheet.getLastRow(); const values = sheet.getRange(1, 1, lastRow, 4).getValues(); const doc = DocumentApp.openById('ドキュメントID'); const docText = doc.getBody().getText(); const subject = 'test test'; //メールの件名 const senderName = {name: 'test'}; //差出人名 for(let i = 1; i < lastRow; i++){ const lastName = values[i][1]; //名前 const mailAddress = values[i][2]; //メールアドレス const body = docText .replace('{名前}',lastName); GmailApp.sendEmail(mailAddress, subject, body, senderName); } }
umau

2021/01/11 05:30

上の方への返答で、受信者は50人未満と言ってますが、ループで取り出そうとしているのは100件です。 空白の行までまわして送信してるんじゃないでしょうか。
Ichiro51

2021/01/11 05:32

コメントありがとうございます。 一斉送信の制限ではなく、エラーの解決法が知りたいです
umau

2021/01/11 05:36

lastRow = 100 を、スプレッドシートに入ってる件数と合わせる、という意味です。 例えば20人分しか入ってないなら、100回ループしようとしたら21人目以降、メアドが空白になりますよね。それでエラーが出ているんじゃないですか、ということです。
Ichiro51

2021/01/11 10:07

理解力なくすみません、理解しました。 A2に名前、B2にメールアドレスの1件のレコードなので、LastRow = 1で設定してみたのですが実行完了となるものの何も起きません。。。 LastRow = 2にしてみるとException: Failed to send email: no recipientとなってしまいます。。。
umau

2021/01/11 10:50

lastRow = 1 で何も起きないのは、for文の 「i」の初期値が 1 なので、1回もループ内に入ってないからだと思います。(スプレッドシートのタイトル行を飛ばすために1始まりにしてるんじゃないでしょうか) lastRow = 2 でエラーになるということは、sendEmail に渡すモノが何かオカシイということですね。 とりあえず以下を試して下さい。 ``` const senderName = {name: ‘test’}; //差出人名 ↓ const senderName = ‘test’; //差出人名 ``` それでもダメな場合、スプレッドシートのメアドの列と、values[i][3] の位置があっているか確認してみて下さい。現在は4列目からアドレスを取ろうとしています。
Ichiro51

2021/01/11 11:10

ありがとうございます。現在はA列名前、B列にメアドとなっております。 values[i][3]ってすみません、どこにありますか? メアドは const mailAddress = values[i][2]になっているように見えまして、、
umau

2021/01/11 11:16

このページに貼られてるソースは value[i][3] がメアドになってますよ。 (投稿後に自分で2に修正されたんじゃないでしょうか。) で、B列がメアドなら、value[i][1] が正解だと思います(配列の添え字は0始まりです)
Ichiro51

2021/01/11 11:36

大変失礼しました。現在は以下になっております。 Nameのところ修正したのですがまだ解決できておりません。。。 function sendMail(){ const sheet = SpreadsheetApp.getActiveSheet(); const lastRow = 2; sheet.getLastRow(); const values = sheet.getRange(1, 1, lastRow, 4).getValues(); const doc = DocumentApp.openById('1DWu0Ji5eW9XCATYbHtcVEUGlptyzjmkdRz04X8xHg'); const docText = doc.getBody().getText(); const subject = 'test test'; //メールの件名 const senderName = 'test'; //差出人名 for(let i = 1; i < lastRow; i++){ const Name = values[i][1]; //名前 const mailAddress = values[i][2]; //メールアドレス const body = docText .replace('{名前}',Name); GmailApp.sendEmail(mailAddress, subject, body, senderName); } }
Ichiro51

2021/01/11 11:54

できました! values[i][1]; //名前 は values[i][0]; //名前 にすべきでした。。。
Ichiro51

2021/01/11 11:54

const values = sheet.getRange(1, 1, lastRow, 4).getValues(); ちなみに上記は何を意味するのでしょうか?
umau

2021/01/11 13:55

スプレッドシートの範囲を取得しています。 1,1 が始点(A1セル)、lastRow,4(D100セル) が終点の範囲を取得して、 2次元配列としてvaluesに入ります。 ※スプレッドシート上は1始まりなので注意です。Javascriptの配列は0始まりなので、ちょっとややこしいですね。
guest

0

一斉送信アプリを作りたい

GAS はそれなりに制限の厳しいインフラなので、一斉送信用途には向いてませんよ。

投稿2021/01/11 04:29

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Ichiro51

2021/01/11 04:32

一斉送信といっても50件未満なので、GASで対応可能かと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問