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

f:id:pcads_media:20220107110643j:plain

こんにちは!TECH Street編集部です!

今回は2021月11月11日(木)に開催した、 「実務で使えるGAS(Google Apps Script)ライブデモ勉強会vol.2」のイベントレポートお届けいたします。

前回も大好評だったGAS勉強会の第二弾!今回はライブデモ2本立てでお送りいたします。

登壇者はこちらのお二人!(登壇順に記載)

伊藤 勇斗さん/吉積情報株式会社
吉積情報株式会社にて、Google Workspace関連の開発業務に従事。Google Cloud Platformを活用したシステム開発の他、Google Apps ScriptやAppSheet等を用いたアプリケーション開発が得意。

Apachanさん/某通信会社
会社員、●業共に業務改善に関わる活動をされています。SaaS全般、RPA、GAS、VBA、Python、Power Queryなど幅広く活用していて、ここ最近はAsanaやノーコードツールにハマっているそうです。

それでは早速ご紹介してまいります!

 

たくさんあるフォームの回答数を自動収集する君をゼロから作成!

伊藤さんからはGoogleフォームで回収したGoogleスプレッドシートから、定期的に情報を取得する方法をご共有いただきます。 

f:id:pcads_media:20220107104821p:plain

複数のフォームを同時に運用していると情報の管理が煩雑になってしまいますよね…!そんなお悩みも、この方法で解決することができます◎
まずは通常通りGoogleフォームを作成。回答のタブからスプレッドシートを開き、回答が記録されるスプレッドシートを生成します。このフォームとスプレッドシートが複数ある想定で、GASを組んで行きます。

まず準備から。

f:id:pcads_media:20220107104842p:plain

①新規スプレッドシートを作成
②管理したい項目を追加(イベント名や開催日時、受付数など) 

この方法で、情報の一覧シート(今回は「イベント参加確認くん」という名称のスプレッドシートを作成、以下、「情報一覧シート」と記載)を作成しましょう。ただ、これらを毎日手動で更新していくのは大変なので、ここからは、GASを使って自動でシートが更新されるようにコードを書いていきます。

まずはツールから「スクリプトエディタ」を選択します。次に、各Googleフォームの回答スプレッドシートのURLを、情報一覧シートから参照するように設定します。

f:id:pcads_media:20220107104908p:plain

該当のスプレッドシート(情報一覧シート)からスクリプトエディタを開いているので、「getActiveSpreadsheet」と記載すれば、特にURLを指定せずとも、このスプレッドシートを指定しているのだとわかってくれます。また、シートの名前も「getSheetByName( ‘ ’ )で指定することで正確に情報を取得できるようになります。

f:id:pcads_media:20220107105809p:plain

次に、情報一覧シート内の、各フォームのURLを取得します。今回は情報一覧シートのD列に記載されている情報を取得したいので、listSheet.getRrange(‘D2:D’)と記載します。何行目まで該当になるかわからない場合は、(‘D2:D’)のように記載するとD列の2行目以降すべてを該当範囲とすることができます。

次に、指定のURLがきちんと取得できているかを確認してみます。console.logの中にrowListを入れて、実行をしてみましょう。

f:id:pcads_media:20220107105107p:plain

実行してみると、情報一覧シートのD列に記載された必要なURLがきちんと取得されていることがわかります。

ここまででURLを取得する準備ができましたが、ここからは各スプレッドシートのURLごとにその中にある行数(=フォームの回答数)も取得できるようにしていきます。

f:id:pcads_media:20220107105353p:plainまずは、繰り返しの処理を行うためにconsole.log (row)を追加し再度実行。この段階だと、実行ログのURLに[ ] がついていることがわかります。この[ ] は不要なので、配列の0番目だけ取れば良い、という指示を記載し、URLのみを取り出せるようにします。

f:id:pcads_media:20220107105512p:plain

const url = row [0] ; を追加して実行すると、上記のように[ ] はなく、URLのみ取り出せるようになりました。

ここから、各URLのスプレッドシートにアクセスしていきます。

f:id:pcads_media:20220107110014p:plain

SpreadsheetApp.openByUrl(Ur1) . getSheets () [0] ; を追加すると情報一覧シートのD列に記載してある各フォームのスプレッドシートにアクセスし、そのスプレッドシートの一番左のシートにアクセスしてくれます。

f:id:pcads_media:20220107110057p:plain

answerSheet.getLastRowで最後にデータが入っている行の数値を取得します。1行目は回答データではなく回答項目の行になっているので、 -1 することで正しい行数(=フォームの回答数)を取得できるように工夫しましょう。

f:id:pcads_media:20220107110129p:plain

ここで出てきているエラーは、情報一覧シートでURLが記載されていない行があった場合、URLがないのにURLを開くように指示を出しているため発生しています。この場合は「空欄でない場合はURLを開く」という指示を入れればエラーが解消されます。

f:id:pcads_media:20220107110147p:plain

ここまでで①各フォームの回答スプレッドシートのURLを取得する②取得したURLにアクセスし、スプレッドシートの行数(=フォームの回答数)を取得するところまで完成です。この後は、情報一覧シートの受付数に、スプレッドシートの行数(=フォームの回答数)を更新するようにプログラムを組んでいきます。

f:id:pcads_media:20220107110211p:plain

スプレッドシートへの書き込み処理は上記のように記載します。C列2行目以降に記載したい内容をlistSheet.getRange (‘C2:C’),setValues(を使って [ ] で指定すると、スプレッドシートのC列に指定した数字が反映されます。

f:id:pcads_media:20220107110256p:plain

f:id:pcads_media:20220107110358p:plain

この[ ] の数字が先ほど取得した各フォームの回答スプレッドシートの行数数値になれば良いので、push関数を使って配列に数値を入れるように記載します。加えて今回は、数値があれば数字を記載する、なければ0と記載する(answeList.push( [0] )、というような指示も追加で記載します。

f:id:pcads_media:20220107110419p:plain

これで、手動で更新せずともプログラムが実行されれば受付数が自動で反映されるようになりました。

最後に、プログラムの実行を定期的に行えるように設定します。

スクリプトエディタからトリガーを開き、実行する関数を選択します。イベントのソースは時間主導型を選択し、1時間おきに情報を取得するように設定して保存します。

この設定をしておくと自動で1時間おきにプログラムを実行してくれるようになります。

f:id:pcads_media:20220107110511p:plain

これだけでなく、スプレッドシートを誰かが開いた時にプログラムが実行される関数も追加することで、

f:id:pcads_media:20220107110539p:plain

スプレッドシートに「スクリプトメニュー」が追加されて、手動でリアルタイムの数値がわかるようにすることもできます。

参加者からは「伊藤さんの仕組み色々応用できそうですね!」というコメントも!完全初心者でも、この流れの通りで実行すればGASのプログラムを作ることができます。ぜひ、お試ししてみてください◎

続いて、Apachanさんからの発表です。

 

ライブラリを活用してGAS利用者を増やそう!

今回のテーマはライブラリ。

f:id:pcads_media:20220106185253p:plain

ライブラリとは、作成した関数を他プロジェクトから利用できる仕組みのことです。ライブラリ登録をしておけばどんなに複雑な処理も1行で呼び出すことが可能に◎

例えばGASを使って休日(土日祝+会社の祝日)の判定をしたい場合。

f:id:pcads_media:20220106185329p:plain

通常であれば左側のコードを書かなければなりませんが、ライブラリを利用するとたった1行で完結することができます。IT初心者であってもこれくらいならできるのでは!と思わせられるような簡潔さですよね。

それでは早速、ライブラリについての前提知識をインプットしましょう。

f:id:pcads_media:20220106190250p:plain

基本的にはライブラリを識別するためにはLibraryという識別子がisBusinessDayのメソッドを呼び出しtodayの引数に指定されたものを入れるとなんらかのresult(戻り値)が出てくるような形になります。

ライブラリは、毎月利用者が増えているのだとか…!ライブラリをマスターすればより快適なGAS生活を送れそうですね◎

f:id:pcads_media:20220106190315p:plain

案件があるたびに、汎用性の高い処理を少しずつライブラリに登録していき、現在は50処理がライブラリに登録されているのだそうです!

実際に書いたコードをライブラリに登録する様子も、デモでご紹介いただきました。

f:id:pcads_media:20220106190336p:plain

今回のデモはスプレッドシートで管理しているシフトのデータが毎朝Slackに投稿されるようなプログラムを作成します。

f:id:pcads_media:20220106190752j:plain

まずは、上記のように管理されているシフトをプログラムで情報が取りやすいように加工します。

f:id:pcads_media:20220107151845p:plain

シフトシートの他に、配信用の別シートを作成し、today関数とHLOOKUPで今日のデータを抽出します。この「配信用」の情報を取得してSlackに流すようにプログラムを組んでいきます。

(メンバーリストには11月11日生まれの芸能人が並んでいることに気づき、ちょっとくすりw)

f:id:pcads_media:20220107103543p:plain

はじめに、拡張機能から「Apps Script」を開きます。

f:id:pcads_media:20220107103558p:plain

スプレッドシートの操作の際にはgetActiveSpreadsheetを使用してスプレッドシートを指定、getSheetByNameでシートの名称(今回の場合は「配信用」)を指定します。そしてgetDateRangeを使って値の入っている部分のデータだけ取り出せるようにし、getValuesで複数のセルを指定します。

ここで一旦ログを取ってみましょう。

f:id:pcads_media:20220107103638p:plain

プログラムを実行すると上記のようなデータが取り出せました。この状態だと、日付の部分の数字が長くなっていますね。この場合は、getValuesをgetDisplayValuesに変更してあげましょう。

f:id:pcads_media:20220107104013p:plain
そうすると、上記のように11月11日とシンプルな表示に変更することができます。続きまして[ ] を外して、1行ずつデータを取得できるようにしていきます。

f:id:pcads_media:20220107104050p:plain

ここではfor文を使い record of recordsで1行ずつのデータを取り出せるように指定します。ここでも一旦実行して、きちんと記載できているか確認しましょう。

f:id:pcads_media:20220107104148p:plain

続いて、hakoを使って配列の状態だったものをみやすい文字列に変換していきます。ここまで準備ができたら、このデータをSlackに送れるように連携していきます。

f:id:pcads_media:20220107104215p:plain

投稿するのでmethodはpost、contentTypeはapplication/jsonと記載します。payloadの記載はSlackの指定によるものなのだとか。事前に連携ツールの規定はチェックする必要がありますね。

f:id:pcads_media:20220107104241p:plain

これで実行してみると、外部ツールへの権限認証のポップアップが表示されますが、これを許可して実行します。

f:id:pcads_media:20220107104304p:plain

すると、Slackに連携されて当日のシフトを送るスクリプトが完成しました。ここでもトリガーを時間で設定すれば、毎日決まった時間にSlackに通知されるようになります。

デモはここで終わりではありません…!ここからは、初心者には少しハードルが高いこのスクリプトを、ライブラリを使って簡単に使えるようにします。

f:id:pcads_media:20220107104333p:plain

今回は二次元配列を文字列に変換するプログラムと、Slackにメッセージを投稿するプログラムを、ライブラリを用いて実装します。手始めに、プロジェクトの設定からスクリプトのIDをコピーします。

f:id:pcads_media:20220107104429p:plain

そして、ライブラリの追加でスクリプトIDを記入し、検索、追加。これでライブラリは使えるようになります。

f:id:pcads_media:20220107104450p:plain

二次元配列を文字列に変換する指示は、text = TECHStreet . change2dArrayToStr ( records ) ; の1行だけで完了しました!(ここのTECHStreetは保存したスクリプトの名称で、変更することができます)

f:id:pcads_media:20220107104515p:plain

続いて、Slackにメッセージを送る指示は、TECHStreet.sendSlackMsgの1行のみで完結。非常に簡潔になりました。

このようにライブラリを用いると、「自分でもできるかも」と思える簡潔さでGASに取り組むことができます。このライブラリのおかげで、GASにチャレンジする人も増えてきたのだとか!GASに興味があるけどまだ試したことがない…という方はまずはライブラリを使って第一歩を踏み出してみるのもオススメです◎

 

まとめ

イベントレポートは以上になります。「GASってなんとなくハードルが高いのでは」…と思っていた方も多いかと思いますが、本日紹介したライブデモで、まずは一歩踏み出してみませんか◎ぜひ、感想もTwitterで #テックストリート などでシェアしてくださいね。

ビデオオンの参加社の皆さまとの集合写真

f:id:pcads_media:20220107111254j:plain

次のページでは、当日のQ&Aを紹介します♬

>>次のページヘ


 

参加者からのご質問

(Q)このまえのGoogle Cloud Next の最新情報とか聞きたいです(GAS関連)

伊藤さん:なかったような気がします…
Apachanさん:一部サービスの名称が変わったのは気づいていましたが…最近社畜気味なので追えていません。

(Q)GASでシステム作った時の一番良い点とイマイチな点、聞いてみたいです。

伊藤さん:1番良い点は、思い立ったらすぐにブラウザで作れるところ。イマイチな点は、規模が大きくなると管理が大変になってしまうところですね。
Apachanさん:予想外の広がりがあった時は、社内で受けたときが嬉しいです。
期待値が上がっていって、もっと大規模で運用したいと言われたときにそれはGASでは・・・となってしまうのがイマイチといった点です。

(Q)たしかに、Googleフォーム貯まっていきますね、、 ちなみにGoogleフォームで取得した回答データとGoogle以外で取得した回答データをあわせて統合することもできますか? Googleフォーム以外で取得した回答データはどこかのスプレッドシートに管理すればいけるかな。。

Apachanさん:Googleフォーム以外で取得した回答データはどこかのスプレッドシートに管理すればいけると思います。
伊藤さん:フォームと連携しているように見せかけて、スプレッドシートと連携しているだけなので、スプレッドシートさえあれば割と何でも使えると思います。

(Q)業務で一番活用されるのはやっぱスプレッドシートですかね?他におすすめ活用ってありますか?導入したいのだよなぁ。

伊藤さん:スプレッドシートがほとんどです。これが便利すぎるというのが理由です。ただ、誰でもいじれてしまうのでスプレッドシートをベースにしながらも、データポータルで表示して閲覧専用の画面を用意するという方法をとったりするとデータ改ざんの防止という点で良いかもです。
Apachanさん:基本的にはスプレッドシートが軸足になって、メール内容を収集したり、チャットツールに通知したりという作りをしていきます。なので、スプレッドシートをまずは抑えておけば良いかと思います

(Q)なるほど、ノーコードではないのですね。実は初めて見ました。エンジニアじゃなくても扱えますか?完全にIT初心者でも。

伊藤さん:今日の内容に関しては全く同じ操作をしてもらえれば作ることができます。しかし、実際に自分で作るとなるといつもと違う作業になるので、つまずくことはあると思います。ただ、ブラウザ上でできるという点でコードを書いて実行という流れがやりやすいです。ここのハードルが下がるという意味では、初心者でも入りやすいと思います。

(Q)今回のプログラムコード、コピペできるような状態でもらえたりしますか? 自分でも試してみたいですm(_ _)m

伊藤さん:スライドを共有するのでそこからコピー&ペーストできます。

(Q)変数とかって命名規約あるのですか?すみません、初心者なもので。

伊藤さん:大体こうするというのが分かってある程度のルールがあれば問題ないと思います。
Apachanさん:開発現場によって違いますが、基本的にはキャメル形式が採用されます。

(Q)初めて見るのですが、すごく勉強になります。文法はある程度覚えるしかないですね。でも楽しそうなのでやってみます。講師様はエンジニア職でしたでしょうか?

伊藤さん:エンジニアです。
Apachanさん:元々は10年くらい家電量販店で営業職をしていました。

(Q)APIは簡単に扱えるのですね。なにか気を付けるべき点ってありますでしょうか?

伊藤さん:API側の規約をしっかり見た方がいいです。間違いやすい点もあるので、実行する前にしっかりと確認しましょう。
Apachanさん:トラブルにならないように利用するAPIのドキュメントは確認することや、リクエスト間隔を2秒ほどあけるなど…いっぱいあります。

(Q)社内講師なのですか?どこで情報仕入れたり勉強されたりしていますか?

伊藤さん:会社として案件があるときもあるし、自分で作っているときにやりたいことを調べて学んでいくことが多いです。やりたいことベースです。ひと息ついてから本を読んで網羅的に勉強しました。
Apachanさん:connpass で興味あるイベントに参加したり、YouTubeで良いコンテンツを見たり、Udemyでコンテンツを購入したりしています。

(Q)ライブラリの公開はどのように行っているのでしょうか?

Apachanさん:デプロイっていうところからやります。[画面表示での説明あり]

(Q)Slack以外でも簡単に行けますか?事例もありますか?

伊藤さん:FreeeやSalesforceなど会社で使っているサービスもAPIが結構あります。ただ、ポリシーで使えるかどうかはまた別問題ですが…。その辺の連携を使って何か作ってみるのはいいかもしれないです。
Apachanさん:何に依存しているかによりますが、LINEやTwitterも連携できます。ある程度APIが提供されているものであればできます。

今回のイベントレポートは以上となります。次回のイベントもお楽しみに!