【イベントレポート】実務で使えるGAS(Google Apps Script)ライブデモ勉強会vol.3

今回は2022年4月28日(木)に開催したGoogleが開発・提供しているプログラミング言語Google Apps Script(GAS)イベント第3弾のレポートをお届けします!実務で使えるアプリのライブデモの様子をお届けいたします。

登壇者は恒例のこちらのおふたりです^^
・伊藤 勇斗/吉積情報株式会社
・あぱchan/某通信会社

まずは伊藤さんからGASを利用したスプレッドシートで定型メールの「自動作成と送信」する方法を共有いただきました。

 

スプレッドシートでメールを自動送信する!

「スプレッドシートで自動作成と送信する」方法について、スプレッドシートに何らかの情報を入れておき、その後メールに送るというパターンと、一旦Gmailの下書きを作ることも可能なので、その2つのパターンをお見せします。

スプレッドシート完成後の見た目はこちら

設定項目を入力する箇所があり、本文もある程度入力すると、それに応じてカスタマイズされた件名や本文を自動的に作ってくれるというもので、黒い線の上部分が入力エリア、下部分が出力エリアになっています。スプレッドシートにある図形描画という機能を使ってオブジェクトを置き、それを押すとGASのプログラムを実行することも可能なので、今回はそのパターンで作ります。また今回の参加者の半数がGAS未経験者ということで、基礎的な説明などもしつつ進めていきます。

早速作成に入っていきますが、その前にプログラムを書かなくてもある程度自動化できる部分はあります。例えば日報を書く際、『その日1日が終わるときだと想像すると、その日の日付を勝手に入れてほしい』としたとき、スプレッドシートの関数【now】とすると自動的に入ります。

now関数

ここで小ネタを1つ。深夜の時間帯を入力したいときは…

表示形式のところでカスタム数値形式を選び、[h]が1つになっているところを[hh]に変更してあげると、例えば26時でも2時に変わらずに26時のまま表示することができます。

シートの【ボタン】は「挿入→図形描画」で好きな感じに作成します。大きさも決めて好きな位置に配置してください。

GASをはじめるときにプログラムを書く領域は、【スプレッドシート】にある【拡張機能】の【Apps Script】を選べば、このスプレッドシートとくっついた状態で作成が可能です。

動いていることを確かめる簡単な方法として、<console.log>という関数を使います。
1行だけコードを書いた状態で上部にある【実行】のボタンを押すと、下部に実行ログが現れます。動作検証などでもよく使われるコードですね。

今回の機能は、
①「本文生成」のボタンを押すと、下部の整形済み本文(オレンジ色の部分)にいい感じの本文と件名が出てくるようにすること。
②真ん中の「下書きに登録」ボタンを押すと、メールの下書きに自動的に作られるようにすること。
③「直接メール送信」ボタンを押すと、そのままメールを送信されるようにすること。

今回やることは3つなので機能を実行する関数=<function>からはじまるくだり(関数)の枠を3つ作るようにします。

<//>から始めると関数とはまったく関係ないコメントを作ることが可能です。
ではなぜ<function>の枠を分けるのか?その理由は2つあります。

枠を分けて作る理由①

このプルダウンから、自分で作った枠のうちどれを実行するかを選ぶことが可能です。
実行したいものだけを選べば、先ほどのように下部にそれだけの実行ログが出てきます。よって細かくテストをすることができます。

枠を分けて作る理由②
今回はそれぞれ名前をつけた3つの関数を、各々のボタンに設定させる必要があります。

設定の仕方はボタン右上で「スクリプトを割り当て」を選び

先ほど作った関数の名前を入れます。設定が終われば、そのボタンを押下すると設定したプログラムを実行するという動きに変わります。またボタンの大きさや場所そのものを変えたいときは、右クリックをすれば動かすことができます。

これで準備は完了なので、あとはそれぞれのプログラムを作っていきます!

これで
①「本文生成」のボタンを押すと、下部の整形済み本文(オレンジ色の部分)にいい感じの本文と件名が出てくるようにすること。
が完成です。必要な情報を入れるだけで一発で本文を作ることができました!

↑上記コードは
②真ん中の「下書きに登録」ボタンを押すと、メールの下書きに作られるようにすること。
のプログラムです。これを実行すると…

Gmailの下書きに自動的に入るようになります。修正する場合はここで直接修正することが可能です。

↑上記は
③「直接メール送信」ボタンを押すと、そのままメールを送信されるようにすること。
のプログラムです。実行すると…

作成されたメールが自動で届きます!もちろん、「直接送信」ボタンを押しても同じようにメールが送信されます^^

 

続きましてあぱchanさんに「新しい出会いに準備万全!スマートな自己紹介」を発表いただきました。

新しい出会いに準備万全!スマートな自己紹介

実際のフォームのデモ画面

ワークフロー

ワークフローとしてはGoogleフォームに趣味や好きな食べ物など、自己紹介に関することを入力して送信すると、右側のスライドショーに自己紹介に関する項目が生成されるというものです。
Googleフォームで項目を入力すると、そのタイミングでGASが走り出すようになっています。

ここでGASのコード作成の前にGoogleフォームを扱う点での注意点をお伝えします。
Googleフォームの値を取得する際にスプレッドシートの最終行から取得しますが、これはかなり危険だと思っています。

なぜなら、誤って最終行よりも下に何かしらのテキストが入力されていると、スクリプトが正常に機能しなくなってしまうからです。基本的には、ユーザーの手が届くところのデータを参照することは避けた方がいいと思います。

事前の準備は

・自己紹介用のGoogleフォームの作成
・スライドで自己紹介用のテンプレートスライド作成
・保存用の自己紹介スライド

上記3つが必要です。
準備に必要なフローとしては下記が必要となります。

今回のキーワードである「イベントオブジェクト」はGAS特有の機能でトリガーを設定できます。今回はGoogleフォームが送信されたタイミングでGASが動くようにしており、その過程でイベントオブジェクトを取得できます。これは送信されたタイミングで、例えばメールアドレスやタイムスタンプなどの周辺情報を取得することが可能です。
そのための条件は…

・コンテナバインドスクリプト
・トリガーとセット
・トリガー設定した関数の引数から受け取り

それぞれの意味合いとして
①は、実際にGoogleフォームと紐づいているエディターであれば使えるということ
②は、どのタイミングでGASを動かすかを設定できるので、その設定も合わせてするということ
③は、トリガーを設定し終わったら、引数からイベントオブジェクトを取得すること
となっています。引数の受け取りについては

こちらの図のように実際に動かす関数の中に(e)と書くと、そこからイベント情報を取得することが可能です。

ここでイベントオブジェクトの発生からの流れについてのポイントを解説します。
前述の通りフォーム送信時のトリガーを引数で受け取とりますが、そのオブジェクトの中身についてはFormResponseオブジェクトはとても有能な働きをしており、ユーザーの方が回答した内容を順番通りにすべて取得することができています。

しかし、フォームを送信した瞬間しか取得することができないので、扱いが難しいというデメリットもあります。開発のときにもやりにくいので、あらかじめ疑似的に、実際に今フォームの中に溜まっているものを取得して、開発を進めていき、出来上がったのちに、イベントの方のFormResponseオブジェクトに切り替えるという流れになります。

溜まっているフォームを取得するコード

顔写真は画像が直接入っているわけではなくファイルIDが格納されているので、他の項目とは別で取り扱ってください。

設問1つ1つを取得する場合

このように、設問や回答を1つずつ取得することもできるが、それは面倒だと思います。
そこで、配列の反復メソッドを使ってまとめて取り出す方法をご紹介します。

やり方は…

「map」という配列の反復メソッド

この形式であれば「map」という配列の反復メソッドを使うことによって、配列の要素に対して処理ができるようになります。処理したものを、responsesという新しい配列の中に格納しているという状態です。

実行したログは以下の通りです。

配列のままではなく、後から加工しやすい形で保存することができます。
しっかりと作り込むことで後続の処理もしやすくなるし、途中で設問の増減があってもメンテナンスする必要がありません。またテキスト部分に関しては、すべてquestionとanswerで値を受け取れるようになるので、上手く使うことで保守性がとても高くなります。

そして、自己紹介のテンプレートからスライドをコピーして貼り付ける処理をします。

次に、保存先のスライドを取得し…

最後にテキストを置換します。

名前、スキル、趣味、好きな食べ物…は、あえて設問のタイトルと合わせています。

よって、このオブジェクトを格納した配列があればできるようになります。

そして画像以外の置換処理を行って実行すると…

画像以外の置換処理を実行した見た目

最後に画像の置換をして…

無事に生成完了です。

しかしこれで終わりではなく、フォームに入力した瞬間にスライドを作成するようにしたいので、イベントオブジェクトからFormResponseを取得するようなものに変えてあげます

イベントオブジェクトからFormResponseを取得するコード

これで完成です。
今回作成した「自己紹介スライドの自動生成」のについては
統一感のない自己紹介の撲滅と同時に作成者負担の業務負担軽減が望めます。またこれだけではなくテンプレートを流用できる業務はほかにもあるのでは?と思っていますので是非皆さんもトライしてみてください

 

まとめ

いかがだったでしょうか?<メール>や<自己紹介><スライド>作成など普段何気なく業務で使用するツールにおいて、GASを活用することで効率化できるヒントになったと思います。ぜひ皆さんも試してみてはいかがでしょうか。

ここからは当日のQ&Aを紹介します◎

>>次のページへ


(Q)まずは何から触るのがオススメか。勉強するにも書籍も本当に多いし。

伊藤さん:一番分かりやすいのは「スプレッドシート」。そこから少しずついじってみては。そこでGASのお作法が分かったらGmailなどにも手を広げていってはどうでしょうか。

あぱchanさん:一語一句、移し替えてたが、入力補間機能とかがあることを知らなかったり、、などあるので、まずは基本的なところを動画などをみて学ぶのがいいのではないでしょうか。

(Q)スプレッドシートの入力箇所の属性なんかの意識はあまり必要無いですか?

伊藤さん:かえってくる値が変わったりするので、日付形式に関しては意識が必要です。特に重要なのは、エラーなどに繋がるので、文字か数値か?といった観点です。

(Q)スプレッドシートで入力と出力のエリアは同じシート内じゃなくても別シートでも作り込みは変わらないですか?教えるために分かりやすい作りで広義いただいているのかなと見込んでいるのですが、理想形ではここはこうするのが良いですね。のようなお話もお聞きしてみたいです。

伊藤さん:はい。実際に社内でも出力されるものはそのたびに新しいシートが作られるようにしたりしています。

(Q)未経験なのですが、これはおもしろいなー!Googleアカウント持ってたら誰でも作れますか?

伊藤さん:フリーアカウントでも作れます!

(Q)勉強になります。やってみようと思います。こちら、もし初めてやった人が躓くとしたらどのあたりでしょうか。初心者躓きあるあるをお聞かせください。
伊藤さん:赤文字エラーが出てきて、エラーをみても何が原因か分からない…というのがツライところ。

あぱchanさん:同じでエラー対応です…。社内でLogger やconsole をなんでそんなに使うの?と批判が来たりします。が、1行ずつしつこいくらいに確認していきます。

(Q)特定のメールを受信した時にGASのプログラムを実行させることは可能なのでしょうか。

伊藤さん:ものにはよります。特定のファイルを開いた時とか、メール受信トリガーはなかったかも?メール受信箱をみて、来ているものをチェックして起動するという処理があります。

(Q)たまにスプレッドシートのファイルオブジェクト取得でエラーが出て処理が終わってしまいます。回避方法はありますか?

伊藤さん:サーバーの調子が悪いときにおこります。try catch 構文とかをうまく組み込むといいかもしれません。

(Q)スプレッドシートの失敗パターン、ずばり経験しました。そういうお話を他にも聞きたい。

伊藤さん:GAS作った人じゃない人に使わせたとき、セル移動などがあると、壊れてしまったときのメンテがキツイ…です。

あぱchanさん:最近だと16桁以上の値ってセルで判定できない。バグってしまう。。
メッセージIDでランダムな16桁の数字になってしまったときに正常な処理ができなくなった…ということがありました。
あまりセルを使わない方が良いなと思いました。

(Q)コメントアウトを一発で行う方法を教えてください。

伊藤さん:*で囲むパターンだと、コメントを閉じれたりするので便利ですね。GASのときは意識せずやってます。

あぱchanさん:複数行選択で[ctrl]を押して / です。

(Q)ログ出力でLogger.log()を使用されていましたが、console.log()との違いを教えてもらえませんか。

あぱchanさん:オブジェクトに対して console を使うとメソッドやプロパティなど全部出てきます。Googleスプレッドシート特有だと、Loggerの方が見たい情報だけ出てくれます。

(Q)初心者ですみません、写真データや項目数によって容量も多くかかってくるかと思いますが、それは個人個人のGoogleアカウントに割り振られたどこかの領域に格納されるのでしょうか?サイズ制限等はあるのでしょうか?

伊藤さん:共有ドライブっていう会社の方にひもづくこともあるが、自分のアカウントに紐づきます。容量は使われるので、使った分容量はたしかに圧迫されます。会社の場合は、会社で容量が決まっていたりするので確認が必要です。

あぱchanさん:フォーム作成時に作成者側で○○メガまで、といった制限をかけることができます。

以上が今回のイベントレポートです!次回のイベントもお楽しみに^^