こんにちは。ひでデス。
早速ですが、社内業務でのGAS利用事例をご紹介します。
なんと、業務が稼働している本物のコードを、赤裸々に公開しちゃいます!
- GASとは、Google Apps Scriptの略称で「ガス」といいます。G Suiteのスプレッドシートやフォームを自動化させることが可能なスクリプトです。
- G Suiteとは、Googleが提供する有料の法人向けクラウドグループウェアです。Gmail、googleグループ、googleドライブ、googleサイト、googleスプレッドシート、googleフォームなどが含まれます(※これ以降では、接頭辞としてのGoogleは省略します)。
- GASはG Suiteの基本機能に含まれていますので、使わないと損です!
なお、GASの導入、権限やトリガーの設定、ログ確認などの詳細については、親切なサイトがたくさんありますので、そうしたサイトをご覧ください。
これから紹介する事例は、「プロジェクト専用フォルダの申請」を受付けるという、実際の業務です。
それでは、順を追って説明します。
1.GASの導入
あなたのChromeにGASを導入します(初回のみ)。
2.フォームとスプレッドシートの作成
利用申込用のフォームを作成し、回答先としてスプレッドシートを設定します。
※まずは、ここに記載の通りに作成してください。
(1)フォーム名は「専用フォルダ利用申請」、スプレッドシート名は「専用フォルダ利用申請一覧」とします。
(2)フォームの標準機能でメールアドレスを自動取得します。
(3)フォームの質問名は、以下とします。
・申請者-氏名
・申請者-部署名
・フォルダ-案件番号
・フォルダ-容量
3.GAS の作成
作成したフォームに紐づけたGASを作成します。
(1)フォームのハンバーガーメニューから「スクリプト」を選択し、表示されたエディタの「function submitForm(e){ … 」を全て削除し、以下をまるごとコピー&ペーストします。
(2)最低でも、メールアドレスをあなたが受信できるアドレスに変更します。
(3)あなたの業務にあわせて、メール件名に埋め込む項目名、シグネチャ、送信元名などを変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
function submitForm(e){ // 参考URL // https://developers.google.com/apps-script/reference/forms/form-response //このフォームと、フォームに紐付いたスプレッドシートのデータを取得する var form = FormApp.getActiveForm(); //このスクリプトを起動したフォームの情報 var formTitle = form.getTitle(); //このフォームの名称 Logger.log("1. LogTitle=[%s]",formTitle); var itemResponses = e.response.getItemResponses(); //フォームに入力された内容 var respondentEmail = e.response.getRespondentEmail(); //フォームが取得したメールアドレス var ssId = form.getDestinationId(); //このフォームに紐付いたスプレッドシートのID var ss = SpreadsheetApp.openById(ssId); //スプレッドシートの情報 var ssUrl = ss.getUrl(); //スプレッドシートのURL var ssName = ss.getName(); //スプレッドシートの名称 if ( ! formTitle ) formTitle = ssName.replace('一覧',''); //form名を強引にset Logger.log("2. LogTitle=[%s]",formTitle); //フォームに入力されたデータを整形する var message = '申請フォーム名: ' + formTitle + '\n' + '(0) 申請者-メール: ' + respondentEmail + '\n'; for (var i = 0; i < itemResponses.length; i++) { var itemResponse = itemResponses[i]; var question = itemResponse.getItem().getTitle(); var answer = itemResponse.getResponse(); var serialNum = '(' + (i + 1).toString() + ')'; //件名で利用するデータを抽出する(注意:フォームの質問名と同一であること)(★1-a) if (question == '申請者-氏名') var applName = answer; if (question == 'フォルダ−案件番号') var applPjNum = answer; message += serialNum + ' ' + question + ': ' + answer + '\n'; } //メール件名を組み立てる(★1-b) var mailSubject = '自動:' + formTitle + '[' + applName + ']' + '[' + applPjNum + ']'; //メールのシグネチャを設定する(★2) var mailSignature = '\n\n--\n' + '業務サポートチーム\n' + 'https://sites.google.com/support-team/\n' + '※このメールはGoogleフォームのスクリプトにより自動送信されました。\n'; //メール本文を組み立てる var mailBody = message + '\n' + '申請一覧名: ' + ssName + '\n' + ssUrl + '\n' + mailSignature; //メールヘッダを設定する(★3) var mailFromName = '業務サポートチーム'; //業務チームの名称 var mailFrom = 'support-team@gas'; //業務チームのメールアドレス var mailTo = 'support-team@gas'; //メール送信先(複数設定可) var mailCc = 'infra-team@gas'; //メール同報先(複数設定可) var mailReply = respondentEmail; //メール返信先(申請者を設定している) //メールを送信する GmailApp.sendEmail( mailTo, mailSubject, mailBody, { from: mailFrom,name: mailFromName,cc: mailCc,replyTo: mailReply } ); } |
解説
(1)不具合の暫定対応とログ
かならず不具合がおきますので、ログを見ることになりますよね。
実際に、「環境によりFormApp.getActiveForm().getTitle()でフォーム名を取得できる場合と、取得出来ない場合がある」という不具合がありました。
残念ながら解決できずに、原因不明なままで運用しています(正確に言うと、暫定対応で満足しており、根本対応をしていません)。
- まずはログを取ります。なお、フォームが実行されるたびにログは上書きされるため、ログクリーニングなどは考慮しません。入れっぱなしです。
8 |
Logger.log("1. LogTitle=[%s]",formTitle); |
つぎに、フォーム名を取得できなかった(formTitleがNullである)場合は、別途取得しているスプレッドシート名を加工して(無理やり)フォーム名としてセットしています。
- この例では、フォーム名の末尾に「一覧」を追加したものをリンク先のスプレッドシート名としていることから、このような対応で対処できました。命名ルールによっては、より高度な加工が必要であったり、そもそも加工ができない場合もあります。
- 念のために、フォーム名をセットした後もログも取っています。
17 18 |
if ( ! formTitle ) formTitle = ssName.replace('一覧',''); //form名を強引にset Logger.log("2. LogTitle=[%s]",formTitle); |
(2)メール件名に埋め込む項目
メールの件名に使いたい回答を(★1-a)で個別に抽出し、(★1-b)で件名として組み立てます。
作成済みのフォームの質問名と、このスクリプト内でマッチングさせている文字列を一致させる必要があります。
だいたい、こういう単純ミスでエラーとなりますね。。
この例では、具体的には、’申請者-氏名’と、’フォルダ−案件番号’です。
30 31 32 |
//件名で利用するデータを抽出する(注意:フォームの質問名と同一であること)(★1-a) if (question == '申請者-氏名') var applName = answer; if (question == 'フォルダ−案件番号') var applPjNum = answer; |
37 38 39 40 |
//メール件名を組み立てる(★1-b) var mailSubject = '自動:' + formTitle + '[' + applName + ']' + '[' + applPjNum + ']'; |
メール件名は、以下のようになります。
自動:専用フォルダ利用申請[田中 一郎][a123456]
(3)メールのシグネチャ
送信元と、自動送信の旨があればいいでしょう。
42 43 44 45 46 |
//メールのシグネチャを設定する(★2) var mailSignature = '\n\n--\n' + '業務サポートチーム\n' + 'https://sites.google.com/support-team/\n' + '※このメールはGoogleフォームのスクリプトにより自動送信されました。\n'; |
(4)メール送信元(from)
Gmailなどの多くのメールクライアントでは、[送信元名][件名(一部)][本文の先頭(一部)]が表示されます。
メール送信元にわかりやすい名称が表示されると親切ですので、送信元名をセットします。
(5)メールの送信先(to)、同報先(cc)
この業務では「申請に対応する部署をToとし、申請の事実を知るだけの部署をCcとする」という運用です。
mailCc と mailReply は、空白でもOKです。
mailTo と mailCc は、カンマ区切りによる複数設定も可能です。
53 54 55 56 57 58 |
//メールヘッダを設定する(★3) var mailFromName = '業務サポートチーム'; //業務チームの名称 var mailFrom = 'support-team@gas'; //業務チームのメールアドレス var mailTo = 'support-team@gas'; //メール送信先(複数設定可) var mailCc = 'infra-team@gas'; //メール同報先(複数設定可) var mailReply = respondentEmail; //メール返信先(申請者を設定している) |
4.GASの設定
フォームからGASを起動させるための設定(認証、トリガー)をします。
※GASを紹介しているサイトの多くで詳しく解説されていますので、割愛します。
5.テスト
フォームに入力し、メール通知されることをテストします。
無事に動けば、以下のようになります。
(1)メール件名だけで、申請名、申請者名、案件番号がわかります。
(2)メール本文を開けば、必要な情報がすべて入っています。
- 申請フォームの名称
- 申請者が入力した全てのデータ(※実際の業務では、この2倍以上の項目があります)。
- リンク先のスプレッドシートのURL
6.おわりに
一見すると大したことが無いように見えるかも知れませんが、通知メールを業務に最適化したことでオペレーションの負荷はかなり下がりました。
あなたの業務が少しでも快適になるといいですね!