2020-03-06に更新

GASで「農作業記録アシスタント」LINE bot作った(技術・設計編)

読了目安:10分

はじめに

制作したLINE botの紹介を前回の記事で書きました。
GASで「農作業記録アシスタント」LINE bot作った(紹介編) - Crieit

今回はそのために活用した技術や設計に関することをまとめてみます。
具体的なコードの中身やLINE botの制作手順などについては割愛させてもらって、考えてきたことやどんな風に実装したか、また残っている技術的な課題や個人的反省について整理してみました。紹介編と合わせてご覧いただけたらと思います。

使用技術等

  • 言語はGoogle Apps Script(Rhinoランタイム:Javascript1.6がベース)
  • LINE messaging API
  • サーバーレス

制作期間

約1ヶ月くらい(要件定義から制作まで)
GASの基礎学習を少しずつUdemyで学習(2週間くらい?)

(1)設計に関して

技術の解説に入る前に、アプリ制作のために構想したことを。
カッコつけて設計とは言ってみたものの、不十分だったり設計とは呼ばない内容かもしれませんがご容赦ください。またこんなにはっきり文章化して作り始めてはいません。

①簡易ペルソナ

農作業の現場作業をしていて記録を簡単に取りたい人。仕事終わりにじっくりと記録をとるのがなかなかめんどくさい人。細かい情報を記入する必要はなく、休憩時間などにちょちょっと記録してちょちょっと見返したり、圃場に出かけた際に簡単に過去の記録を見返したりしたい、というニーズのある自分自身や身近な農業者。

②競合アプリの比較・考察

既存のWEBアプリやスマホアプリは色々あり、農場の認証取得向けのしっかりした大規模なもの、資材管理なども同時にできるもの、農薬の散布制限なども自動で計算してくれるものなど。また個人向けのものや簡単入力ができるものもあるが、ただどうしても入力のところで課題を感じる。

どんなにシンプルなものでも入力のステップが多い
- 毎日・複数回行う入力作業だが、そのステップがどうしても多くなってしまう。最短でもスマホを手に取ってから、①アプリを開いて ②入力ボタンを押して ③フォームに入力して ④投稿を押す
- ものによってはフォーム入力で空欄があると投稿が出来ないものもあったり、画面遷移があるものも。
- プルダウンによる入力も選択肢が多いとかえって不便なことも

入力を習慣づけるのが難しい

初期設定が多く導入のハードルが高いものも
- 初期設定で圃場や所有機械の情報を入力したり使用する資材を入力しておくと便利!というものも多いが、まずそれを設定しないと入力ができないなど導入のハードルが高い。

このようなアプリはしっかり管理したい人にはメリットは多い。ただサクッとメモしたい程度の使い方をするにはストレスを感じる。

一方で既存アプリで参考にしたい点も
- 出力面で、カレンダー表示やカテゴリ毎の表示は必須
- 作業記録のテンプレートをユーザーが用意できて使いまわせるものもあり、それはすごく良い

③このアプリの特徴

入力の手間をとにかく排除
- ①LINEを開いて ②トークルームを開いて ③タップしたら指示に従って選択・入力、の3ステップ。あとは自動で投稿される。
- サクッとメモしたものがそのまま記録される、くらいの手軽さ。twitter投稿くらいの感覚。

日常で使用するツールを使用することで習慣づけがしやすい
- LINEは毎日コミュニケーションツールとして開くし、Googleカレンダーも普段の予定管理に活用しているのでこれらを活用。

シンプルさを保つためにデメリットも
- 画像の登録はできない
- 入力と出力以外の機能が無い(在庫管理などができない)

(2)技術に関して

①GAS(Google Apps Script)とは

GASとはGoogleが提供するサーバーサイドのスクリプト言語です。Javascriptをベースにしており、Javascriptに既に触れている方や学ぶ予定がある人には習得しやすいかなって思います。(「プログラミング言語」という認識でいるのですが、合ってるのでしょうかね?もし違っていたらご指摘お願いします)
古いJavascriptのバージョンにしか対応していなかったのが難点ですが、つい先日、2020/2/6にはV8ランタイムというものをサポートしたことでECMAScriptに対応し、より現在のJavascriptとの互換性が増したようです。(参考リンク1)

Google Apps(Googleドキュメント、スプレッドシート、カレンダー、Gmailなど)と簡単に連携することができるので、これらを活用したちょっとしたツールが作りやすいです。Webアプリも作れます。また開発環境のインストールもいらず、Web上でコードを書いて操作するだけで簡単に公開して実行することもできます。

制限はありそうですが「ある程度ならなんでも簡単にできる」という印象で、仕事や趣味・生活などで「自分やチームで使うツールをちょっと作る」というのには最適かなって思います。

②LINE Messaging APIとは

今では「LINE公式アカウント」でクーポン情報などを流すお店や企業が増えてますが、アレを作ることができるAPI(Application Programming Interface)です。様々な言語で活用できて、LINEを介して双方向のコミュニケーションをとることができるものを作ることができます。
LINE botとして有名どころでLINEで女子高生AIと会話ができる「りんな」とか。面白いですね。

(3)実装内容

今回のLINE botで実装した内容からいくつか簡単に紹介します。

①[GAS] LINEからの入力に対応

バックエンドの処理はGASで記述し、実際にユーザーが使う部分は基本的にLINEになります。この点でまず僕自身でUIを考えてコーディングする必要がなく、機能を制作することに集中することができました。

LINEでユーザーがフォローしたりメッセージを送ったりと何か反応があったら、まずdoPost関数が実行されます。そこからLINEアクションの種類(followだったりmessageだったりpostbackだったり)によって処理を分岐します。

GASでGoogleサービス以外の外部のWeb APIを使うためには、UrlFetchサービスのfetchというメソッドを活用します。これによりHTTPリクエストを送信してWeb APIを叩くことができます。

またLINEでの日報入力の際にユーザーが段階的に入力できるようにするために、GASのキャッシュサービスを活用しています。1つ処理を行ったらCacheオブジェクトに一時的にデータを保存しておくことで、ユーザーからのアクションをフラグで管理して分岐するようにしています。

②[GAS] 日報をGoogleカレンダー・スプレッドシートへ書き込み

GASではGoogleの各サービスにアクセスするためのクラスが用意されています。
- GmailAppクラス:Gmailを操作操作する
- DocumentApp:Googleドキュメントを操作する
- Spreadsheetクラス:Googleスプレッドシートを操作する
- CalendarAppクラス:Googleカレンダーを操作する

これらは先程の外部APIとは違ってGASから使える内部サービスのため、何の準備なしに使うことができます。
これらを利用して日報を専用のカレンダーとスプレッドシートに書き込む処理を作りました。

注意点としては、自分のGoogleアカウントに紐づいているGoogleカレンダーとしか連携できないことです。つまり、僕のアカウントでスクリプトを作成して、そのスクリプト上で他のユーザーが制作したカレンダーに書き込むことができないのです(スプレッドシートなら可能な様子)。

③[GAS] カテゴリをユーザーがカスタマイズ:Webアプリの作成(HTML Service)

毎回の入力の手間を省くために「作業カテゴリ」というものを用意しています。
LINEから日報を入力する際にが選択肢(LINEのクイックリプライ機能)として選べるようにしたのですが、この内容をユーザーが自由に編集できるようにしました。

データの保管場所としてスプレッドシートでセルを用意しており、そのデータを取得することで作業カテゴリを配列で取り出せるようにしています。

またユーザーがカテゴリを編集しやすくするために、その部分だけWebアプリとして制作してみました。要件定義の段階では特に作る気はなく、スプレッドシートから直接編集できるからいいやと思っていたのですが、スプレッドシートに慣れていないユーザーだと編集しずらいだろうなと考えたためです(初期設定のハードル)
これにはGASのHtmlServiceを活用して、最低限のHTMLの知識があれば簡単に制作することができます。

Webページには編集フォームとスプレッドシートに設定されている作業カテゴリが表示されているだけのシンプルなものです。
WebページにアクセスするとまずdoGet関数が実行されます。またフォームで作業カテゴリを編集して送信した場合はdoPost関数が実行されます。doPost関数ではLINEからのアクションなのかWebからのカテゴリ変更処理なのかをイベントオブジェクトeの中身から判断して、Webからの場合なら送られてきた内容をスプレッドシートの作業カテゴリのセルに上書きする、というような処理を行っています。

④[LINE] リッチメニューの作成

LINE messaging APIで一番理解が難しかったのが、LINE messaging APIを活用したリッチメニューの制作方法でした。

リッチメニュー制作にはLINE公式アカウントからの設定方法とmessaging APIを活用する方法の二種類があります。
リッチメニューを使う | LINE Developers

LINE公式アカウントからの制作はとても簡単で、画像を用意さえしておけばブラウザ上で操作するだけで簡単にリッチメニューを作成してLINE botで活用できます。プログラムを書かなくとも誰でも直感的に作ることができるのですが、メニューボタンの配置を細かく決めることができなかったりアクションの種類が限られていたりと、できることに制限があります。

それでもちょっとしたものなら十分なのですが、LINE messaging APIを使うことでもうちょっと手の込んだ、例えばゲームコントローラーのようなボタン配置などをプログラムに落とし込んで作ることができます。

最初に公式アカウントで制作したところ一瞬でできて感動したのですが、魔が差してmessaging APIを活用する方法で実装し直すことにしました(コードで完結できればメンテナンス性も高い?という考えも)。ところがhttpリクエストやRESTの理解が浅かったため自力で実装するのが困難でした。
この実装にはこちらのHASEKATSU様のnote(参考リンク2)を参考にさせていただきました。
一応実装はできましたが、どう言う仕組みで実装できているのかまだちゃんと自分の言葉で説明できないので課題です。

(4)技術的な課題

紹介編にも書いたのですが、データベースの一意性がありません。これはほぼ自分用とはいえかなりの欠陥。
一度入力した日報をスプレッドシートやカレンダーから修正できるのですが、それがもう一方に反映される仕組みが作れていないのです。誤って日報登録してしまうことも多々あるので、一度登録したものを安心して編集・削除できる仕組みが必要なところ。

この部分を解決するためにまず一番最初に考えたのが、Webアプリとしてスプレッドシートの内容を取り出して編集できるようにするというやり方。ところがこれ以上Webアプリ部分に力を割くのは、手間がかかる割にはどうにもGASで制作する意味が薄いように感じます(PHPやRubyでデータベースを用意して作る方が発展性がありそう)。

手軽さとGoogleのサービスとの連携が簡単というGASの良さを引き出すなら、スプレッドシート上で編集するのが良さそうです。と思って調べてみると、値の変更があった際に発動するトリガーがGASで設定できるとのこと。スプレッドシート上の日報履歴が編集・削除されたら、対応したGoogle Calendarのイベントを書き換える…ということが理論上できそうです(Calendarのイベント固有のIDでデータベースを管理する)。

一方でGoogleカレンダーの方で修正したいこともあるのですが、こちらがなんだか一手間二手間かかりそうです。これもGASのトリガー機能を使うことで、カレンダーの編集があったらスプレッドシートにもデータが反映されるようにすれば可能かなと思えたのですが、それにはGASのCalendarAppサービスだけでは出来ない様子。calendar APIという外部APIを使えうことで、なんとかできなくもなさそうな感じです。

というわけで、技術的な課題は現状あるもののクリアできそうです。

おわりに

今回の制作では、初めて念願のAPIというものを活用することができました。
RailsでWEBアプリ開発を学んでいた時には、エラーの対処やフロントエンド作り、環境構築などでいっぱいいっぱいでしたが、デバッグの感覚を学び、今回は比較的とっつきやすい技術を選んで目標を最小限にしたことで、余裕を持って制作できたと思います。

反省としては、GASやLINE botの仕様を把握出来ていなくて、ユーザーに活用してもらうにあたり移行作業に手間がかかったことです。
自分以外のアカウントのGoogleカレンダーへの書き込みが出来ないことに完成間際で気づいて、どうやって他ユーザーに使ってもらうかを考え直すことになりました。結局身近で興味を持ってくれた仲間限定ということで、僕が新規作成したカレンダーを共有して使用してもらう方法をとることに。
また、人数分のLINE botを用意しなければならずそれに対応した使い回しのきくスクリプトに書き換える作業が発生してしまいました。
完成したぜ!という段階からだいぶうだうだやってたのがもったいない。

今後の方針としては、もうちょっとGASでこのアプリの改善と日常で必要なアプリを作りつつ他のAPIの活用のやり方も学んでみたいなーと思っています。

MEMO

僕の過去記事でGASとLINE messaging API学習に役立った教材・ブログをまとめてあります。
もしこれから取り組む方がいましたら参考にしていただけたら嬉しいです!
GAS & LINE messaging APIの学習便利帳 - Crieit

参考にしたサイト

またこちら、本文には特記してないのですが、使用言語としてGASを検討する際の参考に。
GASを使うべきか否かの判断材料 - Qiita

ツイッターでシェア
みんなに共有、忘れないようにメモ

Massa

北海道でアプリ制作に取り組んでるノンプログラマな農夫。仕事や日常生活で感じる小さな不便を解消すべく趣味と実益を兼ねて遊んでます ■Python・GAS + LINE bot

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント