新しいGoogle Formを業務に掻甚する – その②

G Suiteの䞻芁なアプリケヌションはMicrosoft365ずは違い、Google Apps Scriptで開発をし、機胜を匷化する事が可胜です。このGoogle Formも同じです。オリゞナルにはない機胜を付け加える事で、曎にG Suiteが掻甚出来るばかりではなく、党自動で人間が行っおいた䜜業をやらせる事が出来るので、利甚者が倚ければ倚いほど、削枛出来る劎力や時間・コストは倧きいです。

今回は、前回の掻甚するその①に匕き続き、さらにGoogle Apps Scriptで匷化し、色々な䜜業をやらせおみたいず思いたす。このテクニックはFormだけでなく、自䜜のフォヌム類や他のスクリプトでも応甚の出来るものです。

今回䜿甚するファむル

本フォヌムは自動応答機胜付きGoogle Formずしおサむトでリリヌスされおいるものず同じものです。フォヌム自䜓の䜿い方や、现かな蚭定関係や事前準備に関しおはそちらのペヌゞを参照しおください。

送信時スクリプトを䜿う為には

トリガヌの蚭眮

今回玹介しおいるスクリプト類を䜿う為には、必ずトリガヌの蚭眮が必芁になっおいたす。トリガヌ自䜓に関しおはたた別の゚ントリヌで詳しく玹介する予定ですが、ここでは必芁最䜎限これだけはずいうトリガヌの蚭眮に関する解説をしおみたす。

今回自動䜜業させる関数はsendForms()ずいう関数で䜜成しおいたす。以䞋の手順でスクリプト䜜成埌にトリガヌを蚭眮しおください。

ここで泚意しなければならないのは、このトリガヌ蚭眮はこのフォヌムの管理者だけが行っお䞋さい。他の方もやっおしたうず二重にトリガヌが蚭眮されおしたいたす。フォヌムは他の人からは他の人のトリガヌが芋えない仕様なので、トリガヌ削陀もその人でなければ出来たせん。気を付けたしょう。

  1. フォヌムの右䞊の「」をクリックし、「スクリプト゚ディタ」を開きたす。
  2. メニュヌより、「線集」⇒「珟圚のプロゞェクトのトリガヌ」を開きたす。
  3. トリガヌが空なので、リンクをクリックし、実行に「sendforms」、むベントに「フォヌムから送信時」におセットしたす。

図スクリプトトリガヌがなければ動䜜したせん

二重送信されるず蚀われるケヌスに぀いお

ここ数幎QAサむト等で「二重にメヌルが送信されたり、内容が入れ違っお送信される・・・」ずいう方がを芋かけたす。その方々のコヌドが「スプレッドシヌト偎で蚘述し、デヌタが入っおきたら凊理をする」ずいったコヌドを曞かれおいたすが、掚奚したせん。

理由は

  1. Formを同時に利甚した堎合に、耇数の凊理が止たるこずなくスプレッドシヌトに入っおくる。
  2. 排他制埡をしおいない為、䟋えばスクリプトプロパティなどの倀が䞊曞きされお、入れ違いが生じる。
  3. 次々に入っおくるので、参照すべきレコヌドが想定したレコヌドではなく、䞀番最埌に入っおきたレコヌドになっおいる。
  4. そもそも、スプレッドシヌト偎のForm送信時は自動応答メヌルを送るのに適しおいない。
  5. Formに蚘述する手法ず違い非垞にコヌドが煩雑になるFormAppはレコヌドの䜍眮など気にする必芁がない

FormAppは送ったデヌタを確実に取埗し、メヌルを送っおからスプレッドシヌトに曞き蟌みをしおいたす。それぞれのプロセスは独立しおいたす。しかし、スプレッドシヌト偎にしおしたうず䞊列しおいく぀ものの凊理が同時に入っおくるプロセスは独立しおいないので、想定倖の動きになりたす。本コヌドを装備するならば、FormAppで実装したしょう。

FormApp.getActiveForm を呌び出す暩限がありたせん

最近たた仕様が倉わったせいなのか次項の自動応答の機胜を぀けたフォヌムを䜜成したものの、フォヌムを送信しおも自動応答が䜜動せずに「FormApp.getActiveForm を呌び出す暩限がありたせん」ずいう゚ラヌずずもに、Google Apps Scriptが゚ラヌを吐いお停止するずいうケヌスに遭遇したした。

コヌドを芋ればわかるのですが、FormAppに関しおの蚘述は元々ありたせん。以前はこれでも問題なく動䜜しおいたのですが、原因を究明しおみるず、どうやらFormAppは䜿っおいないものの、FormAppの暩限が無いず動かないずいう。実は䌌たようなケヌスに過去Google Pickerのアップロヌド実装でも遭遇しおいたす。

察応策ずしおは、コメントアりトの圢でダミヌで「//FormApp.getActiveForm()」ずいうコヌドをいれお、実行し暩限承認し盎せばOK。Pickerの堎合も//DriveApp.addFile("test")ずいった曞き蟌み暩限のダミヌコヌドを含めるこずで、トラブルを回避しおいたす。

搭茉しおいる機胜

自動応答メヌル機胜

珟圚のGoogle Formには、アンケヌト送信時に「回答のコピヌを送信」する機胜が備わっおいたす。以前はなかった機胜ですが、これで自動応答メヌル的な圹割は簡易的には可胜です。しかし、あくたで簡易機胜であり、その䞭のメッセヌゞであったり、デザむン等をカスタマむズ出来るわけでもないので、䟿利なものではありたせん。

そこで装備したいのが「しっかりした自動応答メヌル送信機胜」です。尚、回答のコピヌを送信で行わせる堎合には以䞋の手順でスクリプト無しで装備が可胜です。

  1. 右䞊の歯車をクリックする
  2. 党般にお「メヌルアドレスを収集する」をチェックする
  3. 「回答のコピヌを送信する」をチェックする

図ただこの機胜はちょっず䞍䟿なんですよね・・・

自動応答メヌルは、HTMLメヌルの圢匏で䜜成をするわけですが、その為にはHTMLタグで改行を加え぀぀メヌル本文を構築したり、たたテヌブルタグで綺麗に敎圢したりたたこの堎合、レスポンシブメヌルにするず非垞に綺麗になりたすしお、申請者や管理者宛に自動でメヌルを送信したす。メヌル本文に眲名や挚拶文などを加える事が可胜になるので、業務やお問い合わせフォヌムなどでは必須の機胜になりたす。

メヌルのSubjectやNameメッセヌゞ内容はスクリプト内に盎接曞くのも良いのですが、メンテナンスフリヌにする為に、このあたりもUIを自分で実装しお誰でも倉曎出来るようにするず尚良いでしょうね担圓者が倉わった皋床で゜ヌスを盎さないず行けないのは䞍䟿ですから。

曞類自動生成機胜

䟋えば申請フォヌムなどの堎合、このたたではスプレッドシヌトに1行申請デヌタが远加されるだけで、ペヌパヌレスならばこれでも良いのですが、䌚瀟内で印刷物で刀子が必芁ずいった堎合には、デヌタから別に申請曞を䜜成しなければなりたせん。この䜜業を人間が行うのは非生産的以倖の䜕者でもないので、予め甚意しお斌いたテンプレヌトをコピヌしお、そこにデヌタを曞き蟌たせる事で曞類も自動生成させおしたうのが良いでしょう。

この埌の項目のPDF化をするにも必須です。Googleドキュメントでも良いのですが、Googleスプレッドシヌトのほうがきめ现かなレむアりトを䜜成し易いので、ここではスプレッドシヌトにお諞類を自動生成させおみたす。

予め甚意しおおいたGoogle Driveのフォルダにファむルを生成したす。デヌタはコピヌした申請曞テンプレヌトの぀ず぀のセルに曞き蟌むのではなく、arrayで受け取ったデヌタを別のシヌトにappendRowで䞀気に曞き蟌み、申請曞シヌトからは数匏でそれを参照する圢にしおいたす。この方が高速に曞き蟌みが可胜です。

ファむルの移動はちょっずややこしいですが、䞀床生成したファむルの芪フォルダからはremoveFileし、栌玍先フォルダにaddFileする事が必芁です。生成したファむルの芪フォルダを知る為に、driveman()ずいう関数を別に甚意しおありたす。最期にfilesIdを本ルヌチンに返しお䞊げおいたす。

自動PDF䜜成機胜

自動生成された曞類はスプレッドシヌトなどのデヌタです。しかし改ざんの可胜性もあったり、即時に印刷をしたい堎合には少々䞍䟿です。この曞類をPDF化しおしたいたしょう。PDF化させる為のルヌチンの詳しい解説はたた別の゚ントリヌで玹介したす。ここではPDF化する為にはこういうルヌチンを組むずいう事だけ玹介したす。

PDF生成は、特別なURLに察しお、UrlFetchAppクラスを䜿っおアクセスさせ、Blob圢匏でPDFずしお取埗したす。その際にsetNameでファむルに名前を付けおいたす。たた、この受け取ったPDFデヌタをDriveAppクラスを䜿っおドラむブ内にPDFファむルも生成させおいたす。

途䞭のrangechkですが、時々デヌタ曞き蟌み完了前にPDF生成にルヌチンが移動しおしたっお、空のたたPDFが䜜成されおしたうこずがあるので、ここで曞き蟌みチェックをする無限ルヌプを蚭けおありたす。チェックするセル番地は䞀番最期に曞き蟌たれる所を指定するず良いでしょう。

メヌルに添付する時には、以䞋のように受け取ったpdfをattachmentに加えれば良いです。耇数のファむルを添付する時には配列で枡しおあげればOKです。

自前でスプレッドシヌトに曞き蟌む

Google Formは自動でスプレッドシヌトぞ曞き蟌む機胜が搭茉されおいるのですが、曞き蟌たれる情報はフォヌム䞊の情報に限られ、たた曞き蟌たれる列の䞊び順なども固定です。これではスプレッドシヌトの二次利甚をする䞊では少々困るケヌスがありたすワヌクフロヌ的なシステムや、お問い合わせ番号で䜜業をするようなケヌス

そこで、曞き蟌み自䜓Google Formにやらせるのではなく、自前でスプレッドシヌトに曞き蟌む機胜を装備する事で、さらに高床なGoogle Formの掻甚をする事が可胜です。䜆し、送信日付に関しおはフォヌム送信内容からは取埗が出来ないので、new Date()で自分で生成しおあげる必芁がありたす。

スプレッドシヌト曞き蟌み

自前で曞き蟌みするずいっおも、さしお難しいものではありたせん。取埗したフォヌムのデヌタにナニヌクIDや自動生成した曞類のURL、たた凊理ステヌタスの初期倀などを自分の堎合曞き蟌たせおたすが、基本は配列を甚意しお流し蟌むだけです。

今回はこの次の項目で玹介するナニヌクIDを配列の䞀番最初に、申請日を配列の2番目に、最期に初期ステヌタスずしお「未凊理」を远加するようにしおいたす。こうする事で、自前で自由自圚にデヌタを曞き蟌みさせる事が可胜になりたす。

ナニヌクIDを割り振っおあげる

ナニヌクなIDずは、絶察にかぶらない連番の事で、䟋えばお問い合わせ番号を発行しおこの番号を元に、双方で仕事をしたり、たたワヌクフロヌ的な仕組みを構築する時に、そのレコヌドを特定するにはナニヌクなIDが必芁になりたす。このナニヌクIDは通垞は1列目に曞き蟌みを行わせたすvlookup関数でその埌参照させたりする事もありたすから。

このナニヌクIDを発行する仕組みには、プロゞェクトプロパティを䜿甚したすが、同時に送信されるケヌスも考慮しおLock Serviceを䜿い排他凊理も装備する必芁がありたす。排他凊理自䜓はたた別の項目で玹介しおいたす。ここではナニヌクID発行の仕組みだけを玹介したす。

原理は簡単で

  1. LockServiceで排他凊理を開始
  2. プロゞェクトプロパティのuidの倀を取埗し、1を加算する
  3. プロゞェクトプロパティにuidの倀を曞き戻す
  4. LockSercviceを開攟する

埌はスプレッドシヌトに曞き蟌む為の配列の䞀番最初にこのuidの倀をpushもしくはunshiftしおあげれば良いです。

自動でCC远加機胜

業務で䜿甚する堎合、自動で䞊叞や関連郚眲の人にCCで通知も送りたい事がありたす。その堎合別のシヌトにその䞀芧を甚意しおおき、それを参照し、MailAppのccにはめ蟌めば良いでしょう。別のシヌトには、申請者のメアド、CC送信先の2列で甚意すればOKです。シヌト名は「CC送信先」ず付けおいたす。デヌタは2行目から入っおいたす。

この時、ナヌザのメアドは自動で取埗させるほうが楜ですが、今回はFormのメヌルアドレス欄で入力されたものを䜿っおCCの送信先を探玢させる方法をあえお取っおみたす。CC送信先はカンマ区切りでセルに入力しおおけば、耇数送れたす。

この凊理では、メヌルアドレス入力欄が䜕番目であっおも、メヌルアドレスずいう名称の入力欄の倀を取埗しおくれたす。たた、そのメアドを元にCC送信先シヌトから䞀臎するメアド、それに察応するCC送信先の倀を倉数ccに栌玍しおいたす。cc送信先がみ぀かったら、break;で抜けお、埌は、MailAppにお、ccにこの倀を加えれば良いです。

フォヌムの回答を削陀する

自前で曞き蟌みをさせる時に、フォヌムに回答デヌタを残しおおきたくない堎合がありたす。その時には、ルヌチンの最期でフォヌムレスポンスデヌタを党お削陀するコヌドを入れお入れおおけば良いでしょう。

※ただし、同時に利甚者がいる堎合、その人のデヌタたで削陀される恐れがあるので、倜䞭などの利甚者れロの時間にトリガヌで実行させるほうが望たしいです。

関連リンク

コメントを残す

メヌルアドレスが公開されるこずはありたせん。 ※ が付いおいる欄は必須項目です

このサむトはスパムを䜎枛するために Akismet を䜿っおいたす。コメントデヌタの凊理方法の詳现はこちらをご芧ください。