みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
Google Apps Scriptで備品購入申請を題材としてワークフローを作る方法についてシリーズでお伝えしております。
前回の記事はこちら。
フォームから送信した内容を含んだメールをGmailで送る方法をお伝えしました。
これで、承認者に備品購入申請の内容をメールで送ることができたわけですが、メールから直接承認できたら便利ですよね。
それを目指していろいろやっていきましょう。
まずは、Google Apps Scriptで特定のURLを踏んだらスクリプトを動作させる方法です。
doGet関数というものを使いますよ。
では、行ってみましょう!
前回のおさらい
まずは前回のおさらいからです。
このシリーズでは備品購入申請のワークフローをGASで作成しております。
申請を行うのはGoogleフォームからで、以下のようなものです。
これを使って申請を行うと、連携するスプレッドシートに以下のように蓄積されます。
スプレッドシートがフォーム送信を受け取ると、「フォーム送信時」のトリガーにより、以下のsendMessageが動作します。
function sendMessage(e) { const [timeStamp, email, shop, item, price, amount] = e.values; const total = price * amount; const recipient = 'hogehoge@example.com'; //承認者のメールアドレス const subject = '備品購入申請のお知らせ'; let 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://docs.google.com/spreadsheets/d/~'; //スプレッドシートのURL GmailApp.sendEmail(recipient, subject, body); }
それで、結果として承認者宛に以下のようなメッセージが届くというところまで進めました。
承認者が受け取ったメッセージからは、スプレッドシートへのリンクが挿入されています。
実は、メールに仕込むURLを「ウェブアプリケーションのURL」に変更をすると、そのアクセスを受けてスクリプトを動作させることができます。
今回は、その方法を紹介していきますよ!
シンプルトリガーとは
「フォーム送信時」のトリガーは、Apps Scriptダッシュボードで設定しましたが、そこで設定するのはインストーラブルトリガーという種類のトリガーです。
GASにはもう一種類別のトリガーがとして、シンプルトリガーという種類のトリガーがあります。
シンプルトリガーは、function名を固定にするだけで特定のイベントに応答して動作する関数を作れるという、その名の通りシンプルなものです。
例としては、スプレッドシートやドキュメントを開いたときに動作するonOpen関数や、スプレッドシートを編集したときに動作するonEdit関数などがあります。
doGet関数とは
今回主役となるのはdoGet関数という関数です。
doGet関数はシンプルトリガーの一種で、ウェブアプリケーションにアクセスがあったときに動作する関数です。
(専門的にいうと、指定したURLにGETリクエストがあったときに動作するものです。)
要は誰かが何らかのWebページや、メール内からURLリンクを踏んだら動作させることができるというわけですね。
それで、以下のように名前を「doGet」にして関数を記述することで作成できます。
’処理
}
それに加えて、以下のルールがあります。
- TextOutputオブジェクトかHtmlOutputオブジェクトをリターンする
- プロジェクトをウェブアプリケーションとして公開してアクセスを受けるためのURLを発行する
んー…ちょっと難し目ですね。
一つずつ見ていきましょう。
doGet関数を作成する
doGet関数のスクリプト
まず、doGet関数から作っていきましょう。
こちらです。
function doGet() { let html = ''; html += '<h1>備品購入申請のお知らせ</h1>'; html += '<p>あなたは備品購入申請のメールのリンクを踏みました</p>'; return HtmlService.createHtmlOutput(html); }
変数htmlには、いわゆるHTML文を文字列で構成して代入しています。
見出しを表すh1タグと、段落を表すpタグだけのとてもシンプルな内容です。
それで、5行目のreturn文ですね。
これが「HtmlOutputオブジェクトをリターンする」という部分です。
createHtmlOutputメソッドとHtmlOutputオブジェクト
HtmlServiceサービスのcreateHtmlOutputメソッドは、引数として指定したHTML文からHtmlOutputというオブジェクトを生成するメソッドです。
それで、doGet関数からそのHtmlOutputオブジェクトをリターンすることで、URLを踏んだ人に、そのHTMLの内容を反映したWebページを返して見てもらうことができるというものです。
これでdoGet関数の準備はOKです。
ウェブアプリケーションとして公開する
続きまして、「ウェブアプリケーションとして公開」する方法を見ていきましょう。
なにせ、踏むURLがなければアクセスできませんからね。
公開してURLを発行しましょう。
doGet関数を書いたら、スクリプトエディタの「公開」メニューから「ウェブアプリケーションとして導入」を選択します。
すると「ウェブアプリケーションとして導入」ダイアログが開きます。
「プロジェクトバージョン」にはバージョン名を適当に入力して、「アプリケーションにアクセスでいるユーザー」は今回は社内ツールを想定して「[ドメイン名]の全員」としました。
「導入」をクリックすると、次の画面で「現在のウェブアプリケーションのURL」が表示されます。
これが目的のURLですので、コピーしておきましょう。
ためしに、そのURLにアクセスしてみると、以下のようなWebページが表示されます。
送るメッセージに公開したウェブアプリケーションのURLを含める
では、冒頭のsendMessageを以下のように変更します。
function sendMessage(e) { const [timeStamp, email, shop, item, price, amount] = e.values; const total = price * amount; const recipient = 'hogehoge@example.com'; //承認者のメールアドレス const subject = '備品購入申請のお知らせ'; let 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 GmailApp.sendEmail(recipient, subject, body); }
16行目を公開したウェブアプリケーションのURLに変更し、それに合わせて15行目の文言も変更しました。
フォーム送信からの流れで確認してみましょう。
受信したメールの中のURLをクリックすると、先ほどと同じWebページが表示されるはずです。
まとめ
以上、Google Apps Scriptで特定のURLを踏んだらスクリプトを動作させる方法をお伝えしました。
doGet関数の役割と使い方について、バッチリ理解いただけたでしょうか?
さて、今回はただの静的ページを表示しただけですが、doGet関数でフォーム送信で追加されたスプレッドシートの行数などの情報をパラメータとして受け取ることができたりします。
その部分を次回以降で紹介していきます。
どうぞお楽しみに!
連載目次:初心者でも作れるGASによる簡単ワークフロー
スプレッドシート、Gmail、フォーム…Google Apps Scriptで操作できるアプリケーションはまさに「ワークフロー」を作成する上で必要なものが揃っています。ということで、このシリーズでは初心者でも簡単に作れるワークフローの作り方について解説をしていきます。- 備品購入申請フォームをGoogleフォームで作成する方法
- Google Apps Scriptでフォーム送信時にメッセージを送るスクリプトの作り方
- Google Apps Scriptでフォーム送信した内容を含んだメッセージをGmailで送るスクリプト
- Google Apps Scriptで特定のURLを踏んだらスクリプトを動作させるdoGet関数の使い方
- GASでURLを踏んでスクリプトを動作させたときにパラメータを渡す方法
- 【GASで作るワークフロー】URLクリックで「承認」とするスクリプトの作り方
- GASで送信するGmailのメッセージをプレーンでもHTMLでも送れるようにする
- GASのワークフローでURLのパラメータで承認・否認を切り替える方法
コメント
いつも楽しく拝見させて頂いております。備品購入依頼シリーズは会社でも同じようなことをGASでやっており大変参考になります。
私のような素人が申し上げるのも大変恐縮なのですが、最近、誤字が多いので連絡だけさせて頂きます。(私は高橋さんのスクリプトをノートに写経し、今度はそれを見ないでスクリプトを自分で入力しながら勉強させて頂いております。)
1.単位を合わせて欲しい(スプレッドシートとスクリプトの内容が異なる)
body += ‘・個数: ‘ + price + ‘\n’;→「個数」はスプレッドシートでは「単価」になっています。
body += ‘・個数: ‘ + price + ‘\n’;
body += ‘・数量: ‘ + amount + ‘\n’;
body += ‘・総額: ‘ + total + ‘\n\n’;
メールに送った内容では単価、総額には円が入っています。(’円/n’)
2. タグ抜けています
html += ‘あなたは備品購入申請のメールのリンクを踏みました’;
3.意味不明な部分
createHtmlOutputメソッドとらHtmlOutputオブジェクト→「とら」は「と」ですよね?
(ご要望)
備品購入を題材にしたワークフローのシリーズは今後どんな展開をされるのか分かりませんが、素人からすると以下のような話を期待しています。
1.配列の話
イベントオブジェクトを配列として扱うときにインデックスだけで扱うと分かりづらいので連想配列やひいてはJSON等へ話が展開していくと面白いかなと思っています。
var shop = e.values[1];
var item = e.values[2];
var price = e.values[3]; ・・・valueの4番目が本当にpriceなのかどうかいちいち確認しないといけない
2.フォームの使い方
これは私が会社の実務の中で感じている疑問点なのですが、備品購入をフォームで申請するときに本当にフォームがいいのかどうか迷っています。実際会社で総務部に事務用品の購入依頼を出すときに一度に最低でも5,6種類の品目をお願いしています。フォームで入力するときは種類別に5回送信するという訳にもいかず使い方がよく分かりません。(そういうわけで会社ではスプレッドシートでやっています)
ワークフローを使った申請手続きはどんな会社であれ必ず存在する大事な手続きなので今後どんな展開になってくるか非常に楽しみです。期待しています。
様
コメントありがとうございます!
数々のミス、申し訳ございません。そしてご指摘大変助かります。
修正をさせていただきました。
ご要望についてですが、ありがとうございます。
参考にしつつ今後の連載を進められればと思います。
今後ともどうぞよろしくお願いいたします。