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

GASのワークフローでURLのパラメータで承認・否認を切り替える方法

$
0
0
no

photo credit: byronv2 No via photopin (license)

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

Google Apps Scriptで備品購入申請を題材にワークフローを作るシリーズをお送りしております。

前回の記事はこちら。

GASで送信するGmailのメッセージをプレーンでもHTMLでも送れるようにする
Google Apps Scriptで備品購入申請を題材にワークフローを作成する方法をお伝えしています。今回は、GASで送るGmailメッセージをプレーンでもHTMLでも送れるようにする方法についてです。

GmailのメッセージをプレーンとHTMLとの両方を作るルーチンを作成しました。

ただ、これまでの内容ですと、承認者は「承認」しかできません。

NG出したいときもありますもんね。

ということで、今回はGASのワークフローでURLのパラメータで承認・否認を切り替える方法です。

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

前回のおさらい

まず、前回のおさらいからです。

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

備品購入申請をする際には、以下のGoogleフォームから申請をします。

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

送信すると、連携している以下のスプレッドシートにその申請内容が蓄積されます。

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

Gmailで承認者にメッセージを送信

と、同時に「フォーム送信時」のトリガーが発火して、以下のスクリプト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 }); }

このスクリプトは、承認者に以下のようなGmailメッセージを送るものです。

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

画像は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 }; }

doGet関数で承認処理をする

承認者が承認をするためにメール内の「こちら」をクリックします。

このURLはGASのウェブアプリケーション公開をして発行したURLで、踏むことで以下の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); }

doGet関数は承認者には「承認しました」のWebページを表示するとともに、申請者には「承認されました」のメッセージをGmailに送ります。

また、スプレッドシートの該当のレコードについて、ステータスを「承認」に変更します。

ワークフローに「否認」のフローを追加する

現在の備品購入申請では、承認者は「承認」しかできませんので、「否認」のフローを追加していきたいと思います。

どのように実現するかというと、以下のようにします。

  • 公開URLに「answer」というパラメータを付与し「ok」と「ng」のパラメータを持つ2つのリンクを用意する
    • 「answer=ok」ならば承認処理(現状存在している処理)
    • 「answer=ng」ならば否認処理

つまり、以下のように2つのURLを用意して、承認者に望む方を踏んでいただくということですね。

https://script.google.com/macros/s/{…}/exec?row=2&answer=ok
https://script.google.com/macros/s/{…}/exec?row=2&answer=ng

Gmailで承認用と否認用の2つのURLを送る

まず、スクリプトsendMessageのほうです。

こちらは、Gmailで承認者へ備品購入申請があった旨のメッセージを送る処理が含まれますので、「承認用」と「否認用」の2つのURLを送るように変更する必要がありますね。

修正したのがこちらです。

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 + '&answer=';

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

  var html = '';
  html += '

備品購入申請のお知らせ

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

9行目で、URLにパラメータ「answer」を追加しています。

加えて、プレーン用は17~19行目、HTML用は26,27行目に承認用URLと否認用URLを仕込んでます。

変更後に実行すると、以下のようなメッセージが送信されますよ。

承認者に送られるGmailメッセージ

doGet関数で受け取ったパラメータにより処理を変える

続いて、doGet関数です。

受け取ったパラメータをイベントオブジェクトから取り出して、if文で分岐処理して…とするとちょっと面倒そうです。

ですが、もうちょっと簡単に対応できますよ。

こちらです。

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);

  var answer = e.parameter.answer;
  var result = {
    ok: '承認',
    ng: '否認'
  };
  
  if(answer){
    sheet.getRange(row, 8).setValue(result[answer]);
    
    var recipient = values[6];
    var subject = '備品購入申請' + result[answer] + 'のお知らせ';
    
    var body = '';
    body += '以下の備品購入申請が' + result[answer] + 'されました。\n\n';
    body += bodies.plane;
    
    var html = '';
    html += '

備品購入' + result[answer] + 'のお知らせ

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

備品購入申請の' + result[answer] + '

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

ポイントは9~12行目のオブジェクトresultですね。

プロパティokに「承認」、ngに「否認」という文字列を格納しています。

つまり、GmailメッセージやWebページで掲載する文言を、このプロパティがどちらかだけを見てオブジェクトのキー指定で内容を切り替えてしまおうという作戦です。

Webアプリケーションのバージョンを上げて、動作を確認します。

否認の場合は、以下のようなWebページが表示されます。

申請が否認された場合のWebページ

Gmailのメッセージも「備品購入申請否認のお知らせ」になっていますので確認してみてください。

まとめ

以上、GASのワークフローでURLのパラメータで承認・否認を切り替える方法をお伝えしました。

非常に簡易的ではありますが、Googleフォーム、スプレッドシート、Gmail、そしてGASを使用してワークフローを作る方法をお伝えしてきました。

今回は、Gmailを使いましたが、代わりにChatworkやSlackを使うこともできますね。

ぜひ、トライしてみてくださいね。

このシリーズはこれで以上となります。

また、便利そうなツールがありましたら、その作り方を紹介していきますね。

どうぞお楽しみに!

連載目次:初心者でも作れる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>