Quantcast
Channel: いつも隣にITのお仕事
Viewing all articles
Browse latest Browse all 2088

GASで送信するGmailのメッセージをプレーンでもHTMLでも送れるようにする

$
0
0
mailbox

photo credit: Hindrik S Hurrying to get there via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

Google Apps Scriptで備品購入申請を題材にワークフローを作成する方法をお伝えしています。

前回の記事はこちら。

【GASで作るワークフロー】URLクリックで「承認」とするスクリプトの作り方
Google Apps Scriptで備品購入申請を題材にワークフローを作成する方法をお伝えしています。今回は、承認者に送られたGmail内のURLクリックで「承認」とするスクリプトの作り方をお伝えします。

メール内のURLをクリックすることでワークフローの承認ができるようにスクリプトを作成しました。

今回は、Gmailで送るメッセージをHTMLメールでも送れるようにしていきたいと思います。

ということで、GASでGmailで送るメッセージをプレーンでもHTMLでも送れるようにする方法です。

では、行ってみましょう!

前回のおさらい

前回までのおさらいを順を追って解説しますね。

Googleフォームで備品購入申請を送信

以下のような備品購入申請のフォームをGoogleフォームで作りました。

Googleフォームによる備品購入申請

こちら申請内容を入力して送信をすると、連携するスプレッドシートに、送信したデータが蓄積されます。

スプレッドシートに追加された申請データ

承認者にGmailでメッセージが届く

それとともに、承認者に以下のようなメッセージがGmailで届きます。

承認者向けのGmailメッセージ

これは、フォーム送信時のトリガーによって、以下のスクリプトsendMessageが動作することによるものです。

function sendMessage(e) {

  var shop = e.values[1];
  var item = e.values[2];
  var price = e.values[3];
  var amount = e.values[4];
  var total = price * amount;

  var row = e.range.getRow();
  var sheet = e.range.getSheet();
  sheet.getRange(row, 8).setValue('確認中');

  var recipient = 'hogehoge@example.com'; //送信先メールアドレス
  var subject = '備品購入申請のお知らせ';
  var body = '';
  body += '備品購入申請がありました。\n\n';
  body += '・購買先: ' + shop + '\n';
  body += '・品名: ' + item + '\n';
  body += '・単価: ' + price + ' 円\n';
  body += '・数量: ' + amount + '\n';
  body += '・総額: ' + total + ' 円\n\n';  
  body += '承認する場合は、以下URLをクリックしてください\n';
  body += 'https://script.google.com/a/~exec'; //公開したウェブアプリケーションのURL    
  body += '?row=' + row;

  GmailApp.sendEmail(recipient, subject, body);
  
}

URLクリックで承認の処理を行う

承認者がGmail内のURLは公開しているWebアプリケーションのもので、クリックすると以下のdoGet関数が動作します。

function doGet(e) {
  
  var row = e.parameter.row;
  var sheet = SpreadsheetApp.getActiveSheet();
  var values = sheet.getRange(row, 1, 1, 8).getValues()[0];

  var shop = values[1];
  var item = values[2];
  var price = values[3];
  var amount = values[4];
  var total = price * amount;
  
  sheet.getRange(row, 8).setValue('承認');

  var recipient = values[6];
  var subject = '備品購入申請承認のお知らせ';
  var body = '';
  body += '以下の備品購入申請が承認されました。\n\n';
  body += '・購買先: ' + shop + '\n';
  body += '・品名: ' + item + '\n';
  body += '・単価: ' + price + ' 円\n';
  body += '・数量: ' + amount + '\n';
  body += '・総額: ' + total + ' 円\n\n';  
  
  GmailApp.sendEmail(recipient, subject, body);
  
  var html = '';
  html += '

備品購入申請のお知らせ

'; html += '<p>あなたは以下の備品購入申請を承認しました'; html += '
    '; html += '
  • 購買先: ' + shop + '
  • '; html += '
  • 品名: ' + item + '
  • '; html += '
  • 単価: ' + price + '
  • '; html += '
  • 数量: ' + amount + '
  • '; html += '
  • 総額: ' + total + '
  • '; html += '
'; return HtmlService.createHtmlOutput(html); }

これにより、承認者には以下のWebページが表示されます。

承認後に表示されるWebページ

また、申請者にはGmailにより以下のメッセージが送信されます。

Gmailメッセージで承認のお知らせ

プレーン版とHTML版の箇条書きテキストを返す関数

さて、上記のスクリプトをご覧いただいて、かなり冗長な部分がありますよね。

まず、スクリプトsendMessageの3~7行目および17~21行目あたり、doGet関数の7~11行目、19~23行目および30~36行目あたりです。

メール本文だったり、HTMLだったりするのですが、似たようなことをしているので統一しちゃいたいですよね…

で、どうするかというと、プレーンもHTMLも作る関数を作って、好きなほうを都度チョイスできるようにしていきましょう。

以下のような関数generateBodiesという関数を作りました。

function generateBodies(values){
  var shop = values[1];
  var item = values[2];
  var price = values[3];
  var amount = values[4];
  var total = price * amount;
  
  var plane = '';
  plane += '・購買先: ' + shop + '\n';
  plane += '・品名: ' + item + '\n';
  plane += '・単価: ' + price + ' 円\n';
  plane += '・数量: ' + amount + '\n';
  plane += '・総額: ' + total + ' 円\n\n';  

  var html = '
    '; html += '
  • 購買先: ' + shop + '
  • '; html += '
  • 品名: ' + item + '
  • '; html += '
  • 単価: ' + price + '
  • '; html += '
  • 数量: ' + amount + '
  • '; html += '
  • 総額: ' + total + '
  • '; html += '
'; return { plane: plane, html: html }; }

備品購入申請の一行分のデータを配列で受け取って、その内容をプレーン版とHTML版の箇条書きにして返します。

オブジェクトで返せば、複数の値も返せますもんね。

GmailでHTMLメールを送る

せっかくHTML版の箇条書きを作ったので、Gmailで送るメッセージもHTMLメールにしちゃいましょう。

GmailAppのsendEmailメソッドですが、第4引数にはオブジェクト形式で様々なオプションを設定できます。

GmailApp.sendEmail(送信先アドレス, 件名, 本文, オプション)

このオプションに、htmlBodyというプロパティ名でHTML文字列を与えてあげればOK。

相手先のメーラーがHTMLに対応していればHTML表示に、そうでなければ「本文」で指定したプレーンな文字列が表示されます。

ワークフローのスクリプトを整理

以上を踏まえて、スクリプトsendMessageと、doGet関数を整理しました。

申請の通知メールをHTMLメール化

まずはスクリプトsendMessageから。

function sendMessage(e) {

  var row = e.range.getRow();
  var sheet = e.range.getSheet();
  sheet.getRange(row, 8).setValue('確認中');
  var bodies = generateBodies(e.values);

  var url = 'https://script.google.com/a/~exec'; //公開したウェブアプリケーションのURL
  url += '?row=' + row;

  var recipient = 'hogehoge@example.com'; //送信先メールアドレス
  var subject = '備品購入申請のお知らせ';
    
  var body = '';
  body += '以下の備品購入申請がありました。\n\n';
  body += bodies.plane;
  body += '承認する場合は、以下URLをクリックしてください\n';
  body += url

  var html = '';
  html += '

備品購入申請のお知らせ

'; html += '<p>以下の備品購入申請がありました。'; html += bodies.html; html += '<p>承認する場合は、こちらをクリックしてください'; GmailApp.sendEmail(recipient, subject, body, { htmlBody: html }); }

プレーン版とHTML版の両方の本文を作っているわりには、若干スッキリできたかなと思います。

6行目でgenerateBodies関数を呼び出しています。

また、HTMLメールが送れるようになったので、24行目の部分ですが、URLを剥き出しにせずに「こちら」にリンクを加えることができるようになりました。

実際のメッセージの表示はこちらです。

備品購入申請のお知らせのHTMLメール

承認の通知をHTMLメール化

続いてdoGet関数です。

function doGet(e) {
  
  var row = e.parameter.row;
  var sheet = SpreadsheetApp.getActiveSheet();
  var values = sheet.getRange(row, 1, 1, 8).getValues()[0];
  var bodies = generateBodies(values);
  
  sheet.getRange(row, 8).setValue('承認');
  
  var recipient = values[6];
  var subject = '備品購入申請承認のお知らせ';
  
  var body = '';
  body += '以下の備品購入申請が承認されました。\n\n';
  body += bodies.plane;
  
  var html = '';
  html += '

備品購入承認のお知らせ

'; html += '<p>以下の備品購入申請が承認されました。'; html += bodies.html; GmailApp.sendEmail(recipient, subject, body, { htmlBody: html }); var html = ''; html += '

備品購入申請の承認

'; html += '<p>あなたは以下の備品購入申請を承認しました'; html += bodies.html; return HtmlService.createHtmlOutput(html); }

こちらも、6行目にgenerateBodies関数を呼び出して、送信するメッセージをHTMLメールに変更しています。

結果はこちらです。

HTMLメールで備品購入承認のお知らせ

まとめ

以上、GASでGmailで送るメッセージをプレーンでもHTMLでも送れるようにする方法をお伝えしました。

今回、スクリプトを整理をしつつ、HTMLメールにも対応するようにしました。

以降のシリーズで、ボタンでクリックできるようにしたいので、その布石でもありますね。

次回ですが、URLを二つ用意して申請の「否認」もできるようにしていきたいと思います。

GASのワークフローでURLのパラメータで承認・否認を切り替える方法
Google Apps Scriptで備品購入申請を題材にワークフローを作るシリーズをお送りしております。今回はGASのワークフローでURLのパラメータで承認・否認を切り替える方法をお伝えします。

どうぞお楽しみに!

連載目次:初心者でも作れるGASによる簡単ワークフロー

スプレッドシート、Gmail、フォーム…Google Apps Scriptで操作できるアプリケーションはまさに「ワークフロー」を作成する上で必要なものが揃っています。ということで、このシリーズでは初心者でも簡単に作れるワークフローの作り方について解説をしていきます。
  1. 備品購入申請フォームをGoogleフォームで作成する方法
  2. Google Apps Scriptでフォーム送信時にメッセージを送るスクリプトの作り方
  3. Google Apps Scriptでフォーム送信した内容を含んだメッセージをGmailで送るスクリプト
  4. Google Apps Scriptで特定のURLを踏んだらスクリプトを動作させるdoGet関数の使い方
  5. GASでURLを踏んでスクリプトを動作させたときにパラメータを渡す方法
  6. 【GASで作るワークフロー】URLクリックで「承認」とするスクリプトの作り方
  7. GASで送信するGmailのメッセージをプレーンでもHTMLでも送れるようにする
  8. GASのワークフローでURLのパラメータで承認・否認を切り替える方法

Viewing all articles
Browse latest Browse all 2088

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>