teratail header banner
teratail header banner
質問するログイン新規登録

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

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

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

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

2318閲覧

スプシの情報を元にGamilと連携しHTMLメールの下書きを作成(※画像インライン表示や太字なども含む)

Oni_hiro

総合スコア5

Google Apps Script

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2023/07/11 02:49

編集2023/07/12 06:24

0

1

①実現したいこと

  • Spreadsheetでメール本文のひな形を作成
  • 上記の本分は<br><strong>などのHTMLタグを含まないでいいようにしたい
  • GASでひな形の内容を同Spreadsheet内の顧客情報データ情報を参照して一部置き換え
  • Googleドライブからインライン表示用の画像を参照しメール本文に挿入
  • Gmailにメールの下書きを保存

②困っていること

1.Spreadsheetで入力する形式のままHTMLメールが作成したい(<br>などをスプシに入れたくない)
2.HTMLメールにすると{{企業名}}などの置き換え用文字の置き換え方がわからない

=A:スプシのデータでHTMLメールにすると置き換えはできるが改行などが反映されない一続きのメールになる

=B:HMTLファイルを別途作成しそれを読み込むと改行や画像の挿入はできているがスプシの{{企業名}}などの置き換えがされていない

このAとBをうまく両立出来る方法があれば知りたいです。

HTML ⇔ GAS の値の受け渡し方法の問題なのかとは思っていますが......

③該当のソースコード

JavaScript

1function mailHTML3() { 2 3 let ss = SpreadsheetApp.getActiveSpreadsheet(); 4 let sheet = ss.getActiveSheet(); //アクティブなスプレッドシート・シートを取得 5 let range = sheet.getDataRange(); 6 let data = range.getValues(); 7 8 //Googleドライブから画像を取得する。 9 const imgA = DriveApp.getFileById('Googleドライブの画像のID').getBlob(); 10 11 var body_html = HtmlService.createHtmlOutputFromFile("メール本文に<br>などを入れたHTMLファイル※本来は使いたくない").getContent(); 12 13 const options = { 14 cc: 'aaa@example.com,bbb@example.com', 15 htmlBody: body_html, 16 inlineImages: { 17 inlineImg: imgA 18 } 19 } 20 21 //Spreadsheetのメール本文を顧客情報を元に差し替え。配列はSpreadsheetのセルの位置 22 for(let i = 2; i < data.length; i++){ 23 24 let recipient = data[i][0]; // 宛先 25 let company = data[i][1]; // 企業名 26 let family_name = data[i][2]; // 宛名_姓 27 let name = data[i][4]; // 宛名 28 let body = data[i][5]; // 本文 29 let subject = data[i][6]; // 件名 30 31 32 //企業名の置き換え 33 body = body.replace(/{{企業名}}/g,company); 34 //宛名の置き換え 35 body = body.replace(/{{宛名}}/g,name); 36 //宛名_姓の置き換え 37 body = body.replace(/{{宛名_姓}}/g,family_name); 38 //署名欄の置き換え 39 body = body.replace(/{{署名欄}}/g,signature); 40 //件名の宛名_姓の置き換え 41 subject = subject.replace(/{{宛名_姓}}/g,family_name); 42 43 44 body_html = body 45 46 // GmailApp.createDraft(recipient,subject,body,options); 47 GmailApp.createDraft(recipient,subject,body_html,options); 48 49 50 };

④差し替え元のメール本文(抜粋)

{{企業名}}
{{宛名}} 様

いつもお世話になっております。
株式会社●●の {{送信者_姓}} と申します。

{{宛名_姓}} 様には、以前我々のメンバー {{名刺交換者_姓}}とやり取りがございましたので、
今回はお得な情報をお伝えいたします。

⑤追記情報1(7/12 13:20)

おかげさまでスプレッドシート状のデータとのリプレイスと、スタイルの適用は対応できました。

<入力スプレッドシート>
イメージ説明

<Gmail下書き>
イメージ説明

あとは現在添付されている画像をインライン表示できれば万々歳なのですが、

 >画像に関してはプレースホルダを利用してreplaceかけるのがいいかと思います。

この辺についてもう少しかみ砕いてご助言をいただけますと大変ありがたいのですが....

⑤追記情報2(7/12 15:15)※希望通りのものが実現できました

※RichTextAppという教えていただいたライブラリを事前にインストール済
https://github.com/tanaikech/RichTextApp#richtexttohtmlforspreadsheet

JavaScript

1 2function gmAuto(){ 3 let ss = SpreadsheetApp.openById("スプレッドシートのID"); 4 let sheet = ss.getSheets()[6]; 5 let range = sheet.getDataRange(); 6 let data = range.getValues(); 7 8 9 //Googleドライブから画像を取得する。 10 const imgA = DriveApp.getFileById('インラインに挿入する画像のID').getBlob(); 11 12 13 // 情報を取りたいi行目がスプレッドシートの3行目から始まるので0,1,2の「2」からスタート 14 for(let i = 2; i < data.length; i++){ 15 16 let recipient = data[i][0]; // 宛先 17 let company = data[i][1]; // 企業名 18 let family_name = data[i][2]; // 宛名_姓 19 let name = data[i][4]; // 宛名 20 // let body = data[i][5]; // 本文 ※今回は使用せず。プレーンテキストの場合はこれでもOK 21 let body = RichTextApp.RichTextToHTMLForSpreadsheet({range : sheet.getRange('F3')}); 22 let subject = data[i][6]; // 件名 23 24 25 //スプレッドシートの本分内の{{プレースホルダ}}の中身の置き換え(一部) 26 body = body.replace(/{{企業名}}/g,company); 27 body = body.replace(/{{宛名}}/g,name); 28 body = body.replace(/{{宛名_姓}}/g,family_name); 29 body = body.replace(/{{アポ候補日時}}/g,appoDate); 30 subject = subject.replace(/{{宛名_姓}}/g,family_name); 31 32 // プレースホルダ{{画像}}で本文の内容をHTMLのimgタグに差し替え 33 body = body.replace(/{{画像}}/g,"<img src='cid:inlineImg'>"); 34 35 36 const options = { 37 cc: 'aaa@example.com,bbb@example.com', 38 htmlBody: body, 39 inlineImages: { 40 inlineImg: imgA 41 } 42 } 43 44 GmailApp.createDraft(recipient,subject,body,options); 45 46 }; 47 48}

<入力スプレッドシート>
イメージ説明

<Gmail下書き>
イメージ説明

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

RichTextApp
こういったライブラリを使用してはどうでしょうか?
インライン画像については自前でどうにかするしかないかと思います。

とりあえずサンプルです。

JavaScript

1 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); 2 var sheet = spreadsheet.getActiveSheet(); 3 4 let company = sheet.getRange('B1').getValue(); 5 let body = RichTextApp.RichTextToHTMLForSpreadsheet({range : sheet.getRange('A1')}); 6 7 body = body.replace(/{{企業名}}/g,company); 8 9 Logger.log(body);

A1にテンプレート、B1に企業名を設定したものです。
イメージ説明

変換したHTMLをブラウザに表示したものです。
イメージ説明

画像に関してはプレースホルダを利用してreplaceかけるのがいいかと思います。

投稿2023/07/11 07:02

編集2023/07/11 07:19
YAmaGNZ

総合スコア10623

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

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

Oni_hiro

2023/07/12 04:26

お返事が遅くなり大変申し訳ございませんでした。 ご助言いただいたライブラリを使って再現ができました(追記情報1) もしよろしければ、インライン表示の方法にもご助言いただけませんでしょうか?
YAmaGNZ

2023/07/12 04:58 編集

例えば本文テンプレート中に{{画像}}と入れておいてメール中に画像を表示するために必要なimgタグに変換する body = body.replace(/{{画像}}/g,"<img src='cid:inlineImg'>"); といった感じでしょうか。
Oni_hiro

2023/07/12 06:28

ありがとうございます! おかげさまで希望通りのものが実現できました。 追記情報2(7/12 15:15)に 上手くいった時のコードを念のためまとめておきます。 これから実践用にいじってみます。 具体的なコードまで、ご回答いただけて本当に助かりました! ベストアンサーとさせていただきます。
guest

0

試していませんが、改行についてはbody.replace(/\n/g,"<br>")でできるのではないかな、と思いました。太字やインライン画像は、HTMLを避けても何らかのプレースホルダが必要になるのでは。

投稿2023/07/11 05:55

Lhankor_Mhy

総合スコア37463

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

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

Oni_hiro

2023/07/12 04:18

お返事が遅く申し訳ありませんでした。 すみません素人でプレースホルダの基本的な使い方すら知らないのですが、 インライン画像を実現するためには必須の知識になりますでしょうか?
Oni_hiro

2023/07/12 05:37

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問