Translate

2021年5月20日

Googleドキュメントを使ってGASで差し込みメールを出す(HTMLメールも可)

ゾウでもわかる Google Apps Script

GASでメールを送信をするのは簡単ですが、メール本文を整形するのが面倒です。

しかし、Googleドキュメントでメールのテンプレートを作れば簡単です。またメール本文の一部を変数として、送付する人の名前などを書き換える差し込み機能を使うこともできます。

テキストメールだけでなくHTMLメールでも同じようにGoogleドキュメントでテンプレートを作成して差し込みメールを出すことも可能です。

今回説明するのは、

  • Googleドキュメントでメールのテンプレートを作る
  • メール本文の一部を送信する人によって書き換える
  • HTMLメールの送信

についてです。

実際に送付されるHTMLメールはこんな感じです。赤字にしている部分が差し込みです。画像も添付しています。

HTMLメールサンプル

テキストメールのサンプルは下記となります。テキストメールなので画像はなく、リンクも使えないのでURLの記載となります。

テキストメールサンプル

メールのテンプレート作成する

先ずは、Googleドキュメントでメールのテンプレートを作成します。


テキストメールのテンプレート

テキストメールは、見たまんまなのでとても簡単です。

赤字が差し込み用の変数です。

面談日のお知らせ

[value1]さん、面談の日程が確定しました。

日付 :[value2]
時間 :[value3]

詳細については、下記URLからご確認ください。

差し込みとするのが赤字の部分です。プログラムで判断できる文字列であれば何でも構いませんが、

  • [value1] ・・・ 氏名
  • [value2] ・・・ 日付
  • [value3] ・・・ 時間

としています。


HTMLメールのテンプレート

続いて、HTMLメールのテンプレートとなります。橙色がHTMLタグです。

<h2>面談日のお知らせ<h2>

<p><strong>[value1]</strong>さん、面談の日程が確定しました。</p>

<ui>
    <li>日付 :<span style="color: red">[value2]</span></li>
    <li>時間 :<span style="color: red">[value3]</span></li>
</ui>
 
<p>詳細については、<a href="https://walking-elephant.blogspot.com/2021/05/shower-head.html">こちら</a> からご確認ください。</p>

<img alt="ゾウでもわかる Google Apps Script" height="180px;" src="https://lh3.googleusercontent.com/StoB14GWX9gSlf6HgsiRuWEn9TyN7XIejqUeWh9GCxQmrGVVxMwXE19xThkj_VvgVOIAdF_3iACbSJyJYPG1hro-bnl9G7yEqMoCWHxgP43oCe-0RHSMTt3fDjoOcLKVSkGbeerL9vI=s16000" title="ゾウでもわかる Google Apps Script" width="320px;" />

GASでメールを送信する

サンプルプログラムは、下記の3パートから構成されています。

  1. Googleドキュメントを読み込む
  2. 読み込んだコンテンツから特定文字列を置換する
  3. HTMLメールを送信する

HTMLメールで送信しますが、HTMLメールが受信できない環境であればテキストメールが表示されます。

サンプルコードは下記になります。

function testMail() {
/***************************************************
* Googleドキュメントを読み込む
***************************************************/
  //GoogleドキュメントのID
  var textDocId = '...1234567890...'
  var htmlDocId = '...abcdefghij...'

  //テキストメール テンプレートの取得
  var txtDoc = DocumentApp.openById(textDocId)
  var txtTemplate = txtDoc.getBody().getText()

  //HTMLメール テンプレートの取得  
  var htmlDoc = DocumentApp.openById(htmlDocId)
  var htmlTemplate = htmlDoc.getBody().getText()

/***************************************************
* メール本文の特定文字列を置換する
***************************************************/
  //変数の設定
  var var1 = 'タカハシ'
  var var2 = '2012年5月14日(金)'
  var var3 = '13:00'

  //プレーンテキスト内の変数を置換
  var bodyText = txtTemplate.replace('[value1]',var1).replace('[value2]',var2).replace('[value3]',var3)

  //HTML内の変数を置換
  var bodyHtml = htmlTemplate.replace('[value1]',var1).replace('[value2]',var2).replace('[value3]',var3)
/*************************************************** * HTMLメールを送信する ***************************************************/ var mailTo = 'sample_mail@gmail.com' var subject = 'テストメール' GmailApp.sendEmail( mailTo, subject, bodyText, { htmlBody:bodyHtml } ) }

Googleドキュメントを読み込む

Googleドキュメントで作成したテンプレートをIDを指定して読み込みますが、6行目がテキストメール、7行目がHTMLメールのGoogleドキュメントのIDとなります。

5. //GoogleドキュメントのID
6. var textDocId = '...1234567890...'
7. var htmlDocId = '...abcdefghij...'

Googleドキュメントの編集URLが下記の場合、赤字の部分がIDです。

https://docs.google.com/document/d/...1234567890.../edit

Googleドキュメントで作成したテンプレートの値に変更してください。

10行目でGoogleドキュメントで作成したテキストメールのテンプレートを上記のIDを指定して開いて、11行目で内容をテキストとして変数 txtTemplate に代入しています。

  9. //テキストメール テンプレートの取得
10. var txtDoc = DocumentApp.openById(textDocId)
11. var txtTemplate = txtDoc.getBody().getText()

HTMLメールのテンプレートも同じように14-15行目で変数 htmlTemplate に代入します。

これで、Googleドキュメントの読み込みは完了です。


メール本文の特定文字列を置換する

差し込み部分の説明です。

21-23行目でメールに差し込む値を定義しています。

20. //変数の設定
21. var var1 = 'タカハシ'
22. var var2 = '2012年5月14日(金)'
23. var var3 = '13:00'

26行目がテキストメール・テンプレートから読み込んだ値の置換、29行目がHTMLメール・テンプレートから読み込んだ値の置換です。

25. //プレーンテキスト内の変数を置換
26. var bodyText = txtTemplate.replace('[value1]',var1),.....省略.....
27.
28. //HTML内の変数を置換
29. var bodyHtml = htmlTemplate.replace('[value2]',var1)......省略.....

replaceを使って文字列を置換しています。

Strings.replace('置換前の文字列','置換後の文字列')

変数をひとつにして説明すると、下記の例では、txtTemplate にある [value1] を探して 細野 に置換した内容を bodyText に代入しています。

var bodyText = txtTemplate.replace('[value1]','細野')

差し込みが多い場合には下記のように分割することもできます。

var bodyText = txtTemplate.replace('[value1]',var1)
var bodyText = bodyText.replace('[value2]',var2)
var bodyText = bodyText.replace('[value3]',var3)

HTMLメールを送信する

メールを送信するのには GmailApp.sendEmail を使います。

GmailApp.sendEmail(送付先メアド, メールタイトル, 本文, {オプション})

34-35行目で mailTo に送信先アドレスを、subject にメールタイトルを代入しています。

自分のメールアドレスに変更してください。

34. var mailTo = 'sample_mail@gmail.com'
35. var subject = 'テストメール'

37-44行目がメール送信部分です。

HTMLメールを送信するので、オプション部に htmlBody:'HTMLメール本文' を指定し、本文 にはHTMLが表示できない場合のテキスト文を指定しています。

こうしておけば、HTMLメールを表示できない環境の場合には、テキストメールが表示されます。

37. GmailApp.sendEmail(
38.   mailTo,
39.   subject,
40.   bodyText,
41.   {
42.     htmlBody:bodyHtml
43.   }
44. )

テキストメールを送信する

テキストメールとして送信する場合は、サンプルプログラムのオプション部を削除して下記のように変更します。

GmailApp.sendEmail(
  mailTo,
  subject,
  bodyText
)

シートの文字装飾された文字列をHTMLメールで送信する

コメントに質問を受けたのでスプレッドシートから値と文字装飾(色、太文字)を読み込んでHTMLメールを送信するサンプルプログラムを作成しました。

読み込むシートには、A1セルに赤字太文字で"象と散歩"と入力しています。

サンプル スプレッドシート

プログラムでHTMLタグを生成する

セルの文字色は、.getFontColor()で取得できます。太字かどうかは、.getFontWeight()でわかります。戻り値が、boldなら太字、太文字でなければnormalです。

次にHTMLの生成ですが、セルの文字が太文字かを判断して、太文字であれば<strong>タグで囲みます。文字色は必ずセットされているので、<p style='color:#カラーコード>で括ります。

文字色は必ずセットされるので、装飾文字のパターンは太字の有無の2パターンですが、文字色が「黒」か「他の色」かの4パターンで生成されるHTMLを下表に示します。

字幅太字文字色HTML
象と散歩なし<p style='color:#000000'>象と散歩</p>
象と散歩なし<p style='color:#ff0000'>象と散歩</p>
象と散歩太字<p style='color:#000000'><strong>象と散歩</strong></p>
象と散歩太字<p style='color:#0000ff'><strong>象と散歩</strong></p>

下記がサンプルコードとなります。

function sendFormattingEmail() {
  // シート名を指定
  let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート1")
  // セルの内容を取得
  let cellValue = sheet.getRange("A1").getValue()
  // セルの文字色を取得
  let cellFontColor = sheet.getRange("A1").getFontColor()
  // セルの文字が太字かどうかを判定
  let cellIsBold = sheet.getRange("A1").getFontWeight() === "bold"

  Logger.log(cellValue)
  Logger.log(cellFontColor)
  Logger.log(cellIsBold)

  // 宛先メールアドレス
  let mailTo  = "sample_email@gmail.com"
  // メールの件名
  let subject = "文字色と太文字を指定したメール"

  // セルの値を取得
  let body = cellValue
  // 太字の場合はstrongタグで囲む
  if (cellIsBold) {
    body = "<strong>" + body + "</strong>"
  }
  // 文字色をstyle属性で指定
  body = "<p style='color:" + cellFontColor + "'>" + body + "</p>"

  Logger.log(body)

  // HTML形式のメールを送信
  GmailApp.sendEmail(mailTo,subject,'',{htmlBody:body})
}

上記を実行すると、セルに設定された文字装飾(文字色と太字有無)で、HTMLメールを送信することができます。(2023.7.23追記)


GASの基礎を学べる参考図書

ある程度プログラミンがわかっていれば、WEBやYoutubeでも十分に調べられると思いますが、初歩的なところからであれば参考図書は有効な学習手段です。

詳解! Google Apps Script完全入門 [第3版]」は、プラグラミング初心者にわかりやすく説明されています。GASを最初に学ぶ一冊として良書です。

4 件のコメント:

  1. 突然失礼します。
    https://teratail.com/questions/la0nize1yqii6t

    上記にて質問を行っており、こちらの記事を見つけ似たようなケースかと思うのですが、うまくできていません。お力添えいただけますと幸いです。

    返信削除
    返信
    1. 『シートの文字装飾された文字列をHTMLメールで送信する』にシートの文字装飾された文字でHTMLメールを送信するサンプルを追記しましたが、回答になっていますでしょうか?

      削除
  2. こんにちは。
    差込メールを作成する際に、すでにセル内に文章を作って一部の文字に文字装飾をかけている場合でもこちらのコードは有効なのでしょうか。
    ※プログラムでHTMLタグを生成するを参照
    初心者のため、ずれた質問となっておりましたら申し訳ございません。

    返信削除
    返信
    1. 「プログラムでHTMLタグを生成する」では、シートのセル内の文章の文字装飾を読み取ってHTMLに置換をしていますが、対応しているのは文字色と太文字だけです。それ以外の装飾(例えば、背景色、アンダーライン、斜体、文字サイズなど)には対応していないので別途プログラムを追加してセルの文字装飾をHTMLに変換する必要があります。

      削除

アクセス上位(過去7日間)