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

f:id:pcads_media:20210816170834j:plain

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

今回は2021年7月15日(木)に開催した、 「実務で使えるGAS(Google Apps Script)ライブデモ勉強会」のイベントレポートお届けいたします。Googleが開発・提供しているプログラミング言語であるGoogle Apps Script(GAS)を活用した実務で使えるアプリのライブデモ2本立てでお送りいたします!

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

・伊藤 勇斗さん/吉積情報株式会社
・Apachanさん/某通信会社

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

 

仕事を始めるときに必要なドキュメントのセットを自動作成する
伊藤勇斗さん 

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

伊藤さんからは、仕事を始めるときに必要なドキュメントのセットを自動作成する方法をライブでもしていただきました!

①テンプレートの作成

はじめに、Google Workspaceからテンプレートを選びます。テンプレートの中には、会社名など必ず入れたい情報を入れてカスタマイズしておきます。

f:id:pcads_media:20210826221931p:plain

このように、使用したいテンプレートがGoogle Drive内に存在する状況を用意します。次に、このテンプレートにスクリプトを仕込むためのスプレッドシートを用意します。

f:id:pcads_media:20210826221945p:plain

スプレッドシートには、テンプレートとファイルの識別子とURLを記載します。

f:id:pcads_media:20210826222028p:plain

スプレッドシートのツールタブを押下し、スクリプトを作成。まずは、ここまで書いてエディタから直接実行を行います。ここでスプレッドシートの編集権限を承認するためのポップアップが出るので、承認し実行。

f:id:pcads_media:20210826222052p:plain

この後スプレッドシート側をリロードすると、【スクリプト】のタブが現れます。この確認ができたら、再びエディタに戻ります。

f:id:pcads_media:20210826222141p:plain

ファイルの識別子を引っ張ってくるための処理を記載し、ここで、値が取れているか一度確認します。

確認ができたら、Google Driveに紐づける処理を記載します。

f:id:pcads_media:20210826222215p:plain

Google Drive関係の処理は「DriveApp」というライブラリから選択します。フォルダを作成するには、rootFolderのあとにcreateFolderと記載します◎

Google Driveの中に、指定した配置用のフォルダが作成できることを確認できたら、次はそのフォルダ内に先ほど作成したテンプレート類がフォルダ内に作成されるように、処理を記載していきます。

▼Google ドキュメントで作成した議事録テンプレートをフォルダ内に作成するための処理

f:id:pcads_media:20210826222329p:plain

▼Google Slideで作成した提案書テンプレートをフォルダ内に作成するための処理

f:id:pcads_media:20210826222352p:plain

▼Google スプレッドシートで作成したガントチャートテンプレートをフォルダ内に作成するための処理

f:id:pcads_media:20210826222414p:plain

このように、順番に記載していきます。GASは手軽に実行できるので、少しずつ実行して確認しながら進めていくのが良いそうです◎

f:id:pcads_media:20210826222502p:plain

コードの全体像はこちら。これを作っておけば、新規の取引先ができたときに、元のスプレッドシートの取引先名を追加するだけで、フォルダと必要書類が自動で作成できるようになります。

こちらは実務で使えたら非常に便利ですね!
続いて、Apachanさんによるライブデモをご紹介します。

 

フォーム回答のスマートな仕事術/Apachanさん

本業、副業共に業務改善に関わる活動をされているApachanさんは、SaaS全般、RPA、GAS、VBA、Python、Power Queryなど幅広く活用されているそうです。5-6年前、システムの問い合わせに追われる日々の中で、GASに出会ったのだとか。

f:id:pcads_media:20210827105543p:plain

GASを導入し、定型の問い合わせを自動化することに成功し、業務の効率化を実現!

GAS活用のオススメポイントは以下の通り。

・実行環境の構築ハードルが低い
・無料アカウントから利用できる
・第三者との環境差分がないので共有しやすい
・スクリプト実行はほぼ成功する
・Google Workspace導入企業であれば基本的に利用OK
・JavaScriptベースなのでプログラミング初心者も始めやすい
・クラウドベースなので24時間スクリプト実行が可能
・SlackなどのSaaSとの相性がいい

一方で、ローカルでの操作は一切できないことや、一実行6分など、利用制限を超えるとスクリプトが止まること、ごく稀にサーバーの不具合でエラーが出ることがある点などは注意が必要なのだそうです。

f:id:pcads_media:20210827111124p:plain

また、RPAとの棲み分け整理で保守運用を安定させることも◎

このほかにもGlideやAppSheet等のノーコード/ローコードツールとGASを組み合わせることで簡単にアプリ開発ができるようになるという点もオススメポイントだそうです!

f:id:pcads_media:20210827111156p:plain

今回のライブデモでは、①フォーム記載時にプルダウンを追加する②プルダウン操作をもとに、後続作業を自動化する、という2つの自動化を実演していただきました。

f:id:pcads_media:20210827111226p:plain

上記シートH列のプルダウンはGASを使って生成されています。この中に「タスク登録」「メール送信」という対応方法のプルダウンがあり、プルダウンの項目ごとに、asanaやGmail、Slackなどと連携されて対応が自動でできるようになっています。

まず、スプレッドシートにプルダウンを埋め込みます。

f:id:pcads_media:20210827111307p:plain

「SetCustomFuncInSheet」を使って、プルダウン選択肢と作成の処理を記載します。

f:id:pcads_media:20210827111337p:plain

トリガーを上記のように設定すると、フォーム送信時にスプレッドシートにプルダウンが作成されるようになります。

f:id:pcads_media:20210827111449p:plain

次に、イベントを設定します。基本的に、イベントオブジェクトが見えにくいので、関数checkEditに(e)を設定するのがオススメとのこと。次に、この関数をトリガー設定します。

f:id:pcads_media:20210827111543p:plain

f:id:pcads_media:20210827111750p:plain

トリガーは上記のように設定します。トリガーが正常に作動していることを確認したら、ここからはイベントオブジェクトから必要な情報を取り出していきます。

f:id:pcads_media:20210827112005p:plain

getLastRow()とgetLastColumn()を使って、セルの行・列情報を取得します。
※デモ中は上記の記述となりましたが、本来はgetRow(), getColumn()のほうがいいとのことです◎

今回の監視対象列はH列のプルダウンセルなので、H列のそれぞれの指示が動くような処理の枠組みを、if文を使って作成していきます。

f:id:pcads_media:20210827112054p:plain

if文をつかったコードは上記のイメージです。イベント発生行の値の取得とオブジェクトへの変換の処理も記載します。

f:id:pcads_media:20210827112255p:plain

また、さらに加工しやすい形でオブジェクトを変換するためのコードも追記します。

f:id:pcads_media:20210827112332p:plain

実行すると、オリジナルのデータが下のオブジェクト形式で表示されるようになります。これを作っておくと、この後の処理が使いやすくなります。

f:id:pcads_media:20210827112358p:plain

ここに、各イベント発生後の処理を追記していくことで、完成!これで、①フォーム記載時にスプレッドシートにプルダウンを追加する②プルダウン操作をもとに、後続作業を自動化するという処理が実現します。

こちらは、業務に取り組むことができれば即、業務効率化、時短に繋がりそうな活用方法ですね。

 

まとめ

今回はライブデモで、実際の操作方法をわかりやすくご説明いただきましたので、具体的なご質問を多いただきました!プログラミング初心者でも触ってみやすいGoogle Apps Script、ぜひ挑戦してみてはいかがでしょうか?◎GASを使いこなして業務効率化を進められたら最高ですね!

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

f:id:pcads_media:20210827112759j:plain

参加者の声

・初心者向けの書籍を読んで勉強しておりますが、このライブデモは初心者向け書籍よりもより踏み込んだ、実務に使えそうな内容で「作ってみたい!」と思いました。Youtubeに公開もありがたいです。時間帯もよかったです!

・使い方間違ってたものがあったので、本来の使い方知れてよかったです。
コメントアウト(//)を一括で消してたとか、(e)はエラーキャッチだと思ってたけど違ったとか、まだ知らない部分あって、楽しかったです。

・業務に使用できそうな事例紹介だったので大変勉強になりました!

次ページでは、当日回答しきれなかったご質問を含めて参加者の皆さまからのご質問と回答を紹介します♪とっても丁寧に回答いただいているのでぜひGASについて疑問があるという方はご覧ください。

>>次のページへ


 

参加者からの質問

“(Q)GASをはじめて使うにあたり、"やってはならないこと"としてどういったことがありますか? 社内へ新たに導入するにしても「どんなリスクがあるのか」「どんな対策があるのか」といった部分にフォーカスされがちで及び腰にならないような雰囲気をつくりたいです。”

伊藤さん:UrlFetchを利用した外部サービスを利用する機能の開発は、慎重に行う必要があると思います。例えば、Webページにアクセスしてスクレイピングをする例が良くありますが、サイト側で明示的に許可している場合で無い限りは行為自体がグレーであるなどが考えられます。

Apachanさん:クラウドサービスなのでセキュリティ面の懸念はあります。Google WorkspaceのAdminより自社に合った設定にしておいた方が良いと思います。

“(Q)GASによって動作していたものがGoogle側の仕様変更で突然使えなくなってしまうということは過去にありましたか?”

伊藤さん:基本的な機能(スプレッドシートセルの読み書き)などでは起こりにくいですが、Google Drive上に共有ドライブが増えた際などは細かな変更点などが影響することはありました。

Apachanさん:旧ランタイムで作成したプロジェクトが勝手に新ランタイムに差し代わり動かなくなったことはあります。
過去には非推奨となったメソッドも数多くあるため、動かなくなる原因はいくつかあるように思います。非推奨メソッドなどはリリースノートから確認できます。

“(Q)個人情報保護法などの関係で、GAS側で操作しないほうが良いデータというものはございますか?”

伊藤さん:社内のルール次第かとは思います。
GASで操作できる対象=アカウントへ参照権限以上がついているデータだとは思いますので、GASというよりは、そのデータに対する取り扱いルール自体の確認が必要かと思います。

Apachanさん:社内セキュリティルールに従う必要があります。弊社は個人情報の取り扱いはGASでは行っていません。

“(Q)GoogleAnalyticsのレポートのようにGASが動作について集計したり、分析したりすることは可能でしょうか?GASの貢献度や活動状況、エラーの出具合など簡単に把握できればなと思っております。”

伊藤さん:script.google.comへアクセスして、ある程度実行状況などのレポートを見ることは可能です。GCPのプロジェクトとリンクすることで、ログをCloud Loggingというサービスで扱えるようになりますので、それを元にBigQueryと連携してアレコレやる、という形もできるかもしれません。

Apachanさん:GAのようなリッチなレポート機能はありません。規模にもよりますが、GCPにログを連携して一元管理するのも良いかも知れません。

“(Q)御社で一番「これは使えた!好評だった!」のGASを聞きたい。 逆に、一番酷評だったものも聞かせて下さい!”

伊藤さん:日報を作るアプリは結構多くの方が使ってくれました。この仕事について何時間やった等を細かく記録しないといけないので、自動で時間を生成するようにした。酷評は届いていません。

Apachanさん:フォームに対してメールで自動送信するというのが色んなところで横展開されています。一番工数が減ったという声を聞いています。酷評は特にないです。GASはそこまで工数をかけて作るものじゃないので、使えなくてもしょうがないかと大目にみてもらえます。

“(Q)ここが困るよGoogleちゃん!(GASちゃん)というのが聞きたいです。”

伊藤さん:使っている私はそういうものだよねっと思っているけど、たまに遅いといわれたり、たまに失敗(エラー)がでちゃったりすることもしばしばあります。

Apachanさん:6分の壁は時々どうにかしてほしいと思うことがあります。作り方・運用を工夫しなくちゃいけないので。

“(Q)グループウェアとしてオフィス365入れているのですが、GASも十分活用できますか?”

伊藤さん:はい、何かしらアカウントをご用意頂く必要はあるかと思いますが、十分活用可能だと思います。

Apachanさん:弊社はオフィス365も使っていますが、業務の主がGoogleサービスなのでGASは重宝しています。Googleサービスへの業務上の依存度次第で変わってくるかと思います。

“(Q)プログラミング未経験者でも実用的なシステム作れますか?”

伊藤さん:プログラムを実行するまでの高いハードルとなる開発環境の構築などをする必要が無いので、未経験者にやさしいと思います。
また、GWSでやっている操作を自動化する、という目線で組んでいけば、コード量も少なく済むため、十分実用可能だと思います。

Apachanさん:初心者でも実用的なシステムは作りやすいと思っています。

“(Q)ライブコーディング素晴らしかったです!インタフェースってよく変わりますか?”

伊藤さん:GASはあまり変わらないです。変更の頻度は高くないですが、サイレントで変わることはあります。

Apachanさん:2009年GAS登場以降大きく変わったのは、今年の初めの1回くらいと記憶しています。

“(Q)ローコードと聞いていましたが、けっこうがっつりなプログラミングですか?!初心者でもいけますか??(実際はPythonとか普通のプログラミングよりも簡単?)”

伊藤さん:まずJavaScriptが基本になっているので、そこまで悩まないのではないかと思っています。情報も沢山落ちているので。また、書いて実行もすぐにできるので、勉強しやすいです。がっつりプログラムを書くこともできます。

Apachanさん:はい、GASはプログラミングです。しかし、環境構築が容易で、Googleサービスを便利に動かすためのクラスやメソッドが多数用意されています。常日頃からGoogleサービスを使っていれば、ご自身の作業効率化につなげやすいのでとてもおすすめです。

“(Q)そもそもGASがわかってないのですが、マクロ的なモノってイメージ? RPAに近いものかなぁと思っていましたが…”

伊藤さん:マクロ的なイメージであっています。

Apachanさん:コードを記述する分、RPAよりマクロに近いと思います。

“(Q)実際に社内で使うシステムを作る場合も、いま見せていただいたような進め方・作り方になりますか?”

伊藤さん:大体、書いて便利だったら少しずつ使ってもらうみたいなことをしています。広く使ってもらう場合はライブラリにしてコードを隠して出すこともあります。

Apachanさん:大きな相違はないかと思います。要件をヒアリングして設計が終わると、ある程度ブロック毎に分割できるので、そこから順番決めしていきます。

“(Q)版数管理などはどのようになりますでしょうか?”

伊藤さん:ソースコードを別途GitHub等で管理しながらやる方法や、プラグインを使うこともできます。ただ、GAS上でというのが今はど忘れしてしまいました…汗

Apachanさん:標準機能では不十分なので、Chromeのアドオン、Google Apps Script GitHub アシスタントでバージョン管理はできます。

“(Q)GASライブ作成すごいですね。初めて見ました。開発環境はこちら限定ですか?使いやすいですか?”

伊藤さん:去年エディタがアップデートされたことで、だいぶ使いやすくなりました。一般の開発者に馴染みのある、ローカルでの開発のために、claspという開発ツールが用意されています。それを用いることで、好きな環境でコーディングを行い、成果物をGASにアップロードするという形で開発を進めることができます。

Apachanさん::VScodeなどと比べるとカスタマイズ性が低いので物足りなさを感じる方もいますが、入力補完など最低限必要なものは揃っている必要があります。
CLIツールのclaspを利用すれば、ローカルでGASの開発環境の構築は可能です。typescriptなどもサポートされています。

“(Q)自分の作ったスクリプトを、他の人に使ってもらおうとすると、権限の許可ができず「このアプリはブロックされます」と出てしまい、実行ができないことがあるのですが、原因がわかりません… 権限の注意点など、ありますでしょうか? ”

伊藤さん:権限は、GWS側の設定にも影響を受ける部分のため、一概には言えないところがあります。他の人が同じ組織(ドメイン)のアカウントである場合は、そのスクリプトの中で利用する各種ドキュメントに対する権限がついているか、なども確認が必要です。
詳しくは公式ドキュメントをあたる必要がありますが、まとまったわかりやすいページとかは特段用意されていないため、少しずつ可能性のある原因を潰す形で検証することが多いのが体験としてあります。

Apachanさん:詳しく確認しないと正確なことは言えませんが、Gmailやスプレッドシートなどを操作するスコープの認証やシートの編集可否など作成者と他の人の権限の差分など原因として考えられます。有償、無償でユーザー情報取得に差分があり動かないこともあります。

“(Q)アプリ実行権限の注意点や躓き経験はありますか? 自分の作ったアプリを他人に渡すと権限の許可の手順で「このアプリはブロックされます」と出て実行ができないことがあるのですが、原因がわからず困っています”

伊藤さん:スプレッドシートから使うタイプのものはその人の権限なので、割と大丈夫ですが、Webアプリとして使う時などにこの問題でてきます。アカウントごとに1日に動いてよい時間などが決められていたりするので、その辺の確認が必要です。

“(Q)他の言語に比べて、参考書や参考ページが多くないかなと思います。これは参考になるよ!というWebページがあれば、是非教えていただきたいです!”

いつも隣にITのお仕事
officeの杜

“(Q)営業職からのエンジニアですか!すごい!学習大変じゃなかったですか?ちなみに他のプログラミング言語はできますか?”

Apachanさん:最初の一つ目の言語は大変でした。Python、PHP、Ruby、VBA、JSはある程度分かります。

“(Q)RPAツールと棲み分けというのは、RPAツールとGASの連携なんかもできたりしますか?って実用的じゃないかな?

Apachanさん:RPA側から特定の件名のメール、ドライブの特定の場所に保存など、RPA側からGASが発動するトリガーを引いてあげる仕組みを作れば連携は容易です。

“(Q)毎週の朝の勉強会素晴らしいですね、どのくらいの社員が参加されていますか?みなさんのレベルは?”

Apachanさん:今いる部門が業務部門で社員であればだれでも参加可能。基本的には非エンジニアが参加するので、レベルは高くない。しかし、そこに参加しているので意識は高い。勉強素材も動画など提供しています。毎回30名程度です。

“(Q)Googleフォームから情報を入力した内容をスプレッドシートに送信した場合に、時間差で重複送信されてしまうことがあります。この事象は私だけでしょうか?Google側のバグでしたらどのような対策を入れていますか?”

Apachanさん:過去何度かありました。原因不明です。プロジェクトを作り直したら解消しました。

“(Q)伊藤様もAPA様も元エンジニアではないのですよね?いまの経験どれくらいでしょうか?”

伊藤さん:すみませんバリバリエンジニアです!8年くらいです。最近3年くらいは管理業務がメインになりましたが。

Apachanさん:コードを書き始めてから5年くらいです!

“(Q)GASはスプレッドシートをDBのように扱うことができるのが魅力だと思っているのですが、WEBアプリとスプレッドシートを連携させる方法や、WebAPIとして動作させる方法を実演して頂けるとありがたいです。”

伊藤さん:GASにWebアプリを作る方法もあります。その時はスプレッドシートに書き込むこともあります。Webアプリを触らずにスプレッドシートの情報を介することもあります。

Apachanさん:Web知識も必要になってくるので、スプレッドシートの特定範囲を抽出して、テーブルタグを使って…みたいなことをするので、ハードルは上がると思います。次回機会があれば是非!!

“(Q)ちょっと困っています。フォーム回答をスプシに落とし、名簿と比較して回答有無列にて○×を判断しています。GASでfor&if文でスプシの回答有無列から×の時にメールアドレスを取得するのですが「結果を連結しメールを送信したい」ところ、for文で取得したアドレスの連結の仕方が、いまいちよく分からず。アドバイスがあればいただけると嬉しいです。”

伊藤さん:すみません、ちょっとイメージできませんでした、、

「xがついている行の内容を連結したメールを、回答した人に送りたい」
の場合は、

A列(お名前)、B列(内容1)、C列(内容2)、D列(メルアド)、E列(oとx)

に対しては、getRange('A2:E').getValues()とやって
[
[名前1, 内容1, 内容2, メルアド, ox],
[名前1, 内容1, 内容2, メルアド, ox],
:
[名前1, 内容1, 内容2, メルアド, ox],
]
のようなデータを取り、forで回してif文でoxのところがxのときだけ、内容を
const body = 名前1 + "様、回答を受け取りました。内容1は" + 内容1 + "です。 内容2は" + 内容2 + "です。ありがとうございました";
こんな感じで文字列連結したものを作って、MailApp.sendEmail() とかで送信する、みたいなことは出来ると思います。

文字列の連携の方法は、テンプレートリテラルというやり方のほうがスマートにかけるので、それも調べてみてください。

Apachanさん:ちょっと言葉で説明するのは難しいですが、×の行番号も分かれば、メールアドレスに該当する列から取得できるように思います。(※フォームではメールアドレス取得にしていますよね?)for文で1,2,3...行目と見ていくので行番号は分かりますよね? 

イベントレポートは以上となります。ご登壇いただいた伊藤さん、Apachanさん、ご参加頂いた皆さまありがとうございました!次回のイベントレポートもお楽しみに♪