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

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

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

Sendmailは、インターネットで電子メールを送受信するサーバソフトウェア(MTA)です。ユーザーが送信したメールを受け、他メールサーバへ引き渡しバケツリレー式に配送したり、届いたメールをユーザーが受け取るまでの間保管するといった働きをします。

Google スプレッドシート

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

Google Apps Script

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

Q&A

解決済

3回答

889閲覧

スプレッドシートからメールを作成する場合の繰り返し処理について

Zakro

総合スコア9

Sendmail

Sendmailは、インターネットで電子メールを送受信するサーバソフトウェア(MTA)です。ユーザーが送信したメールを受け、他メールサーバへ引き渡しバケツリレー式に配送したり、届いたメールをユーザーが受け取るまでの間保管するといった働きをします。

Google スプレッドシート

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

Google Apps Script

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

0グッド

0クリップ

投稿2020/02/10 03:02

前提・実現したいこと

スプレッドシートで教育受講有無を管理しています。
教育受講期限が過ぎた対象者に対してメールを送信する
仕組みを作っています。

未受講の教育が複数ある場合、メールの本文を以下のようにしたいのですが、
コードの書き方が分かりません。
・対象教育名① 期限日① 教育資料のURL①
・対象教育名② 期限日② 教育資料のURL②
・対象教育名③ 期限日③ 教育資料のURL③

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

未受講の教育が複数ある場合、メールの本文が以下のようになります。

・対象教育名①
・対象教育名②
・対象教育名③

・期限日①
・期限日②
・期限日③

・教育資料のURL①
・教育資料のURL②
・教育資料のURL③

エラーメッセージ

### 該当のソースコード (メール本文作成に必要なコードのみ記載しています。) //本文に必要な項目の配列を作成 //教育名 var arrayTodo = new Array(); //教育資料URL var arrayURL = new Array(); //期限日 var arraydeadline = new Array(); //本文に必要な項目の値を取得する //教育名 var todo = ss.getRange(3, j + 8).getValues(); //教育資料URL var URL = ss.getRange(1, j + 8).getValues(); //期限日 var deadline = ss.getRange(6, j + 8).getValues(); //完了日付が空の場合メール対象者とする if(finishDate[0][0] === ''){ //var arrayLimit = new Array(); arrayTodo.push(todo[0][0]); arrayURL.push(URL[0][0]); arraydeadline.push(deadline[0][0]); //未完了の教育すべて取得しメールを作成 if(arrayTodo.length !== 0){ var body = ''; for( var k = 0; k < arrayTodo.length; k++ ){ body += '・' + arrayTodo[k] + '\n' ; } //教育資料URL if(arrayURL.length !== 0){ var body2 = ''; for( var l = 0; l < arrayURL.length; l++ ){ body2 += '・' + arrayURL[l] + '\n' ; } //期限日 if(arraydeadline.length !== 0){ var body3 = ''; for( var m = 0; m < arraydeadline.length; m++ ){ body3 += '・' + arraydeadline[m] + '\n' ; } } //GmailApp.sendEmail(宛先, 件名, 本文) GmailApp.sendEmail( // ↓メールアドレスを入れた配列からひとつずつ取り出す mailaddress[i], // ↓件名 'xxxxx', // ↓本文 // ↓名前を入れた配列からひとつずつ取り出す(\nは改行) member[i] + 'さん' +'\n' + '\n' + body + '\n\n' + body2 + '\n\n' + body3 + '\n\n' +

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

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

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

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

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

guest

回答3

0

自己解決

教えてもらった以外の方法で自己解決しました。

投稿2020/02/13 03:05

Zakro

総合スコア9

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

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

macaron_xxx

2020/02/13 04:04

その方法を記載してください
Zakro

2020/02/13 06:34

ここ見てる人、めんどくさい人多いですね。
guest

0

2020/02/05 から V8 エンジンが利用可能になったので、

javascript

1//未完了の教育すべて取得しメールを作成 2if(arrayTodo.length !== 0){ 3var body = ''; 4for( var k = 0; k < arrayTodo.length; k++ ){ 5body += '・' + arrayTodo[k] + '\n' ; 6} 7//教育資料URL 8if(arrayURL.length !== 0){ 9var body2 = ''; 10for( var l = 0; l < arrayURL.length; l++ ){ 11body2 += '・' + arrayURL[l] + '\n' ; 12} 13//期限日 14if(arraydeadline.length !== 0){ 15var body3 = ''; 16for( var m = 0; m < arraydeadline.length; m++ ){ 17body3 += '・' + arraydeadline[m] + '\n' ; 18} 19}

をこのように1行でかけるようになりました。

javascript

1/* 2準備 3 表示メニューから「マニフェスト ファイルを表示」にチェックをつけます。 4 appsscript.jsonに `"runtimeVersion":"V8"` を追加します。 5json: 例(このまま写すとメール送れなくなるので) 6{ 7 "timeZone": "Asia/Tokyo", 8 "dependencies": { 9 }, 10 "exceptionLogging": "STACKDRIVER", 11 "runtimeVersion":"V8" 12} 13* */ 14 15const q2405480 = (arrayTodo, arrayURL, arraydeadLine) => { 16 return arrayTodo.map((e,i)=> `${e}\t${arrayURL[i]}\t${arraydeadLine[i]}`).join(`\n\n`); 17} 18

使いかたは前記引用部分を消して body = q240480(arrayTodo,arrayURL,arraydeadLine); です。

なお「メール本文作成に必要なコードのみ記載しています。」とのことにより、コードの構造をぶち壊しているので、このコードが動かなくても直しようがありません。
デバッグ依頼の時点で非推奨質問なのですから、開き直って全文のせましょう。取り繕うために、無意味なことならまだしも有害なことはしないでください。

投稿2020/02/10 04:27

papinianus

総合スコア12705

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

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

0

質問のプログラムは、

body1に

・対象教育名①

・対象教育名②
・対象教育名③

body2に

・期限日①

・期限日②
・期限日③

body3に

・教育資料のURL①

・教育資料のURL②
・教育資料のURL③

をそれぞれ代入してから、メールの本文を

// ↓名前を入れた配列からひとつずつ取り出す(\nは改行)

member[i] + 'さん' +'\n' + '\n' +
body + '\n\n' +
body2 + '\n\n' +
body3 + '\n\n' +

としているのですから、メールの内容は”発生している問題”に書かれているようになって当然です。
==
・最初に未受講の件数の長さの配列(仮にmessageLinesという名前にします)を用意して、

・forループで
messageLines(i) = 対象教育名(i) + " " + 期限日(i) + " " + 教育資料のURL(i)+ '\n\n'
というような感じで、本文の1行分を配列に順に代入しておいて、

・初期値が""の変数(仮にhonbunという名前にします)にforループで
honbun = honbun + messageLines(j)
というような感じで、一つの文字列にまとめる。

・そして最後に
member[i] + 'さん' +'\n' + '\n' + honbun
をsendEmailの本文に使えば良いのでは?

投稿2020/02/10 03:35

coco_bauer

総合スコア6915

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問