Help us understand the problem. What is going on with this article?

フォームとGASで簡易ワークフローを作ってみた

More than 3 years have passed since last update.

【まえがき】

今回はGoogleDriveの機能だけでワークフローできないかなーということで
挑戦してみた件をご紹介いたします。
※あんまり実際のScriptが書いていないので役に立たなかったら、すいません。

AddOnとか3rd party製でいいものあると思いますが、
そのあたりとは比べないでくださいね。

【まとめ】

フォームとGASを使えば簡単なワークフローは組める!!

【ポイント】

①すべてのデータを集約するシートを作る

 ⇒承認状況を確認できるように!

②申請Noを持ち、キー項目とする

 ⇒ワークフローで異常が起きないように!

③マスタシートを作成し、承認者の変更にも対応可能とする

 ⇒部署異動等にも対応!

【設計】

前提:2段階承認⇒繰り返せば何段階でも…可

処理概要

① 申請者がフォームから必要事項を入力し、申請
② SpreadSheetにフォームの回答が入る
③ SpreadSheet上で別シートにデータをコピーする(処理用シート)
④ コピーされたシートのデータを元に承認者にメールを配信する)
⑤ 届いたメールのリンクから承認用フォームを開き、承認・否認を入力する
⑥ SpreadSheetに⑤のフォームの回答が入る
⑦ ⑥のデータを元に処理用シートに承認結果でStatusを書き換える
⑧ ⑦の結果を元に承認であれば、最終承認者にメールを配信する。
  否認の場合は否認メールを本人に配信する
⑨ ⑤~⑧を繰り返す(さらに繰り返せば・・・)
⑩ 結果を元に承認完了か否認かのメールを本人に配信する
キャプチャ.JPG

【作成したもの】

★Form & SpreadSheet 3セット

 >申請用フォーム&申請用回答シート/処理用シート/マスタシート
 >承認用フォーム&承認用回答シート
 >最終承認用フォーム&最終承認用回答シート

★AppsScript

・申請用回答シート
  >dataCopy(申請用回答シート) …10分に1度ぐらいで十分
  申請フォームの回答を処理用シートにコピーする処理
 
  >mailSend …10分に1度ぐらいで十分
  Statusに基づきメールを配信
 
  >dataClear …1日に1度ぐらいで十分(夜間処理)
  フォームの回答を日時で削除

 ・承認用回答シート/最終承認用回答シート
  >dataSend …10分に1度ぐらいで十分
  承認/否認の回答を元に処理用シートのStatusを変更

【Scriptのポイント】

全部のScriptを書くのもちょっとあれなので、
ポイントになるところだけ…

●申請用回答シートへのデータコピー(dataCopy)時のポイント

1.承認フラグ(Status)列を作り、その結果を元にユーザーに分かり易い承認状況列を表示させる
 dataCopy 処理時に元データにプラスして下記2項目を作る
 ①「承認状況列」
  例:回答用シート.getRange(最終行+1,列).setFormula('=vlookup(U'+最終行+1+',flg!A:B,2,false)');
  ⇒flgシートには承認状況と承認フラグのマスタを作っておく

 ②「承認フラグ列」に1をSet
  ⇒1は「未処理」を意味する
 
 この「承認フラグ列」の値を別シートから更新することで、ワークフローの条件分岐に使う

例:mailSendで下記条件に基づきメール配信を行う
 1 未処理 :申請された状態
 10 一次承認待ち:一次承認メールが配信された状態
 15 一次否認 :一次承認にて否認された状態
 20 一次承認済み:一次承認にて承認された状態
 30 最終承認待ち:最終承認メールが配信された状態
 35 最終否認 :最終承認にて否認された状態
 40 最終承認済み:最終承認にて承認された状態
 50 完了 :40の状況から承認完了メールが申請者に送付された状態
 98 一次否認 :15の状況から否認メールが申請者に送付された状態
 99 最終否認 :35の状況から否認メールが申請者に送付された状態
※あくまで一例です。使いやすいように調整してください。

2.承認依頼メールの承認フォームへのリンク
 mailSendで承認依頼メールを送る際に、承認フォームのリンクを送付します
 その際に、「処理用シート」のデータ行とマッチングを書けるために、
 「申請No. 」デフォルトセットしたフォームのURLを送ります。
 var formURL = "https://docs.google.com/フォームのURL?entry_XXXXXX="+対象の行No;
 ※entry_XXXXX="+対象の行Noのところがキモなのですが
  このentry_XXXXXというのはフォームの項目をセットします
  ⇒対象のフォームをライブフォームで開き、右クリック⇒ページのソースを表示とすると
   <label class="ss-q-item-label" for="entry_XXXXXX"><div class="ss-q-title">申請No.
   と対象の項目のentry keyがわかりますので、そちらをセットします。

3.メールの送信先
 mailSendで承認依頼メールを送る際の宛先もマスタ化して、
 承認フラグと他のキー項目(所属部署等)によって、
 対象の承認先を取得して送信
 ※このあたりはSpreadSheetのループ処理で対象者を探す感じです。

ちょっといろいろと端折りすぎちゃいましたが、
一応こんな感じで作るとワークフローがこんな感じで組めました。

社内の稟議通すぐらいのワークフローであれば、こんな感じで十分かなと思われます。

【さらに!】

「フォームじゃファイルの添付ができねーじゃねーか!」というご指摘もあるかと思いますが、
そんな時は、DriveにアップしてそのURLを項目に記載してもらえば対応可能です!
注:権限の付与を忘れずに!

【あとがき】

2年振り2回目の投稿ということにふと気が付きましたが、
そんなことは置いといて・・・

「こんなんじゃわかんない!」とか「もっと詳細を!」とかあれば、
コメントいただけたら嬉しいです!
できる限りコメントでお答えしたいと思います!

最後までお読みいただきありがとうございました!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away