WebディレクターがGoogle Apps Script(GAS)でオペレーション改善してみた

この数年、地元(横浜)で飲むときには必ずといっていいほど野毛のダーツバーから飲みが始まるのですが、ダーツがまったく上手くなりません。まあ、ビールもテキーラも飲んでフラフラになりながら投げておりますから、真面目に投げる気もなければ上手くなろうなんておこがましいのですが。とはいえせっかくみんなで楽しくやるのであれば上手くなってアッと言わせたい。どうしたもんかな、と思いながら一人でバグースに行ってヤミ練に行ったりするのでした。

すみません、アドベントカレンダーの話ですね。個人的なブログになるところでした。Google Apps Script(GAS)について書こうと思います。

事のはじまり

発端は私が担当している法人営業案件のオペレーション改善でした。LPから清掃希望のお問い合わせがメールで届くようになっているのですが、その件数や内容把握を容易にしたい、という要望があり、問い合わせ管理機能の開発や導入もすぐにはできないし、どうするかなーと思っていた時にGoogle Apps Script(GAS)でどうにかならないか、とぼんやり考えていました。

Google Apps Script(GAS)とは?

Google Apps Script は JavaScript ベースのスクリプト言語で、ドキュメント、スプレッドシート、スライド、フォームなどの G Suite サービスをカスタマイズ、拡張できます。インストール作業は不要です。ブラウザ内で動作するコードエディタが用意されており、スクリプトは Google のサーバーで実行されます。

だそうです。つまりGoogleの開発・提供しているプログラム言語ですね。

すでに社内でもGASを使って効率化している話も聞いていたので、GASなら解決できるかも?と思うもJavaScriptは書けません。書けなければ誰かに書いてもらうしかない…!と言っても開発の猛者にそう簡単に依頼できるわけもなく。そんなときGoogle先生に聞いてみたところ、

「GASコピペするだけでいける!」

と、そんな記事が落ちてました。コピペするだけでいけるんか。素晴らしい。

メールの件名からカウントしてみる

どうやら世の中には同じような悩みを抱えている人がいるようで。中には同じくGASで解決しようとしていた人もいて、なおかつそのGASのプログラムも親切に公開してくれている人もおりました。

「良し!コピペだ!」

簡単じゃないか、とSpreadsheetのスクリプトエディタを開き、記事にあったプログラムをコピーし貼り付け、取得する件名を指定し、貼り付け先のSpreadsheetを指定するだけ。コピペするだけとはいえ、ここらへんは変えないと動きません。

準備ができたところで実行すると、なんと指定したメールがSpreadsheet上に展開されています。素敵。

これをもとにSpreadsheetで関数を組んでその日にいくつ問い合わせがあったかを把握できるようになりました。

覚えたオブジェクトとメソッド
GmailApp.search:指定したGmailの中から件名やら本文を検索してくれる
GmailApp.getMessagesForThreads:スレッドからメッセージをまとめて取得してくれる

最初はコピペしてただけなので後から覚えたのですが…(正直)

問い合わせ件数をSlackに飛ばしたい

件数がSpreadsheet上で把握ができたとしてもわざわざ見に行くのはめんどくさい、Slackに飛ばしてくれとFeedbackがありました。Feedback is Gift。イエッサーであります。

Google先生に聞いてみたところ、今流行りのSlackですから、同じようなことをしてる人がいました。ただ今回はコピペするだけとはいきません。というのもその日にあった問い合わせ件数をSpreadsheetの日付ごとに行レコードにして記録していたのですが、その情報をもとにSlackに通知しなければいけません。

Slackの通知の仕方はソースがありコピペするだけでいけますが、オリジナルで作ったリストを参照して数値を取得しSlackに飛ばす、そんな都合のいいソースがあるわけもなく。似たようなことを探して組み合わせるしかありません。

要件としては
①リストの日付を参照してそのレコードにあるデータを取得
②取得したデータをテキスト化してSlackのとあるチャネルにデイリーで朝8時頃に飛ばす
です。

①はfindRowを使ったらいけそう、②はデータをJSON形式にしてそっから文字列にしてUrlFetchAppを使ったらいけましたが、このfindRowがなかなか難しく、日付のフォーマットが違うと取得できなかったり、そもそもの日付を定義づけるのもしなくてはならなかったりで完全に手探りでしたが、四苦八苦しながら金曜の深夜すぎになんとかSlackに件数を飛ばすことができ、GASのトリガー(予定)を組んで無事終了です。

覚えたオブジェクトとメソッド
findRow:Spreadsheetの特定の行を検索

別のSpreadsheetに転記したい

そんな中、オペレーション改善目的で案件管理シートが刷新されました。これまでは管理システムに入れたものをSpreadsheetにして案件管理として使っていたのですが、そもそも管理システムに入れられる機能が本来の使い方ではなかったため、その機能を使わずに案件管理シートに記録していく必要がありました。

さすがに問い合わせメールから手作業でのコピペはオペレーションコストがかかりすぎるので、GASの出番です。やりたいことは至ってシンプルです。

①メールから取得する内容を件名だけでなく本文まで取得しSpreadsheetのセルごとに格納していく
②セルに格納されたデータを取得し別のSpreadsheetに転記していく

①の本文まで取得するところは簡単でしたが、セルに格納していくところでつまづきました。本文の1行ごとの内容を1セルずつに格納したかったのですがなかなか上手くいかず、まるっと1セルに格納しやがります。改行の表現が違うみたいです。それを開発メンバーにどうしたら良いか聞いたところ下のコードでしっかり取得できました。素晴らしい。

split('\n')

そんなこんなで次は転記です。

転記で必要だったのがセルの指定とそれの取得と格納です。それらをgetRangeとsetValueで項目ごとに指定していきます。元のSpreadsheetのセル位置を指定してデータを取得し、別のSpreadsheetのセルを指定し取得したデータを格納する記述を書いていきます。

項目が大量にあるがゆえに、1つでもセルの数字が違えば違う値を返してきます。融通がききません。それがプログラムです。ちょっとでも記述が間違えれば実行されません。エラーを繰り返し出しているところを何が違うのか調べながら解決していきます。開発の人たちすごいなーとしみじみ思うのでした。

そんなこんなで転記GASもなんとか動くものが作れました。

振り返り)要件定義をしっかりと行う

自分でプログラムを書いているときに感じたのは、要件定義の精度です。頭の中ではこんなことをGASでやりたい、というイメージはあるものの具体的にやりたいことを言語化できないと、Google先生も的外れな記事しか教えてくれず、解決できるコードになかなか辿りつかなかったです。今回自分でプログラムを書く上でどんなことをどう解決するのか、を細分化していくことでGoogle先生に聞くなりする時にするすると解決していった気がします。

また今回プログラムを書いてみて『再現性』を意識しました。エラーが起きたときに何が悪さをしているのかの切り分けや何をどうしたら再現するのか。一つひとつ精査して検証していき精度を高めていくのだなあと当たり前ですが改めて勉強になりました。

そして動くプログラムを書いていきプログラミングの面白さにハマっていくと段々とアドレナリンが放出されはじめ「これ、こう書いたらもっと効率良いのでは!かーっ!天才!」と調子にのってました。アドレナリンは真夜中の作業だったからかもしれませんが。

再現性…そういえばダーツは再現性が問われるけど、なぜ狙ったところに入らないのか、入ったときは何が良かったのか一つひとつ振り返って精度を高めっていったら上手くなっていきそうな気がしてきました。

おしまい。

この記事が気に入ったらサポートをしてみませんか?