Google Apps Scriptでサークル内システムを構築しまくった話

総コン Advent Calendar 22日目です。
今回は私が所属しているサークル「総コン」でサークル内システムを構築した話を書きます。

Google Apps Script(以下GAS)とはGoogle様が提供している開発環境です。
言語はJavaScriptで、基本的にはGoogleの有用なサービスのAPIを叩いて自動化することが目的です。
Webブラウザ上で動作し、Google Drive上のスプレッドシートなどのサービスと連動してスクリプトを組むことができます。

GASはGoogleの強いサーバーを借りて動かすのでサーバーの保守が不要な上、無料で全ての機能が使えます。
またGoogleAPIだけでなくSlackなど外部のAPIも叩けるので、IFTTTのように様々なサービスを連携させたアプリを作ることができます。
さらにGoogleアカウントに紐付けて権限を与えられるので、マルチユーザーで運用できます。
無料で使えて引継もしやすくてもう全国のサークルで導入してほしいと切に思ってます。
少しでもGASを使い始めるサークルが増えてくれればと思い、この記事で布教しようと思います。

システムは全てスプレッドシート(Excelもどき)で動いています。

名簿管理システム

今まで名簿の管理をExcelでやっていたようなのですが、総コンは割と入会者が多いので自動化しました。
また今年度から全体でSlackを導入したので、Slackとの連携も図ります。

入会の流れ

  1. Googleフォームで入会を申請する
  2. Slackに通知がくる
  3. 申請がスプレッドシートに書き込まれる
  4. 申請を確認して問題なければチェックを入れる
  5. ツール名簿登録からチェックのついた申請を一括で名簿に登録する
  6. 入会完了メールが送信される
  7. Slackのチャンネルに通知される

退会処理も同じです。

ツール

f:id:tkww:20171222210426p:plain
名簿管理システム: ツール

  • 年齢、所属班によるフィルタリング
  • Slack
    • チームへの招待メール送信
    • ID、ユーザ名の取得
    • 役職、所属班、学年別のチャンネル招待
    • プロフィールのDM (Slack内プロフィール統一のため)
    • 指定のメッセージをDM
  • メール
    • 入退会完了メールの送信
    • 指定のメッセージをメール送信

Tips: フォーム

  • 個人情報と所属班を入力する
  • Slack登録前はメールアドレスでやりとりするので、間違いがないよう2回入力させる
  • 表記ゆれがないようできるだけラジオボタン(選択形式)にする
  • 学籍番号や電話番号は正規表現を使ってデータの不備を減らす
  • 継続手続きはSlackのユーザ名で簡単に済ませる
  • 入会申請が来ていることをSlackに通知する

Tips: スプレッドシート

  • 申請と名簿を分ける
  • 名簿登録ツールでは自動的に2つのメールアドレスが正しいか判定
  • メッセージの送信は指定したセルから内容を取得
  • 日付の指定はデータの入力規則から日付を選択することでカレンダーから指定できる
  • 役職の指定はスクリプト内に役職を定義しておいて自動的にプルダウンメニューの候補を生成
  • SlackのIDは登録したメールアドレスと照合させアカウントを特定している
    • ちなみにIDとユーザ名は異なる IDが不変な方
  • 名簿は編集権限を所有者だけにする

展望

  • 拡張性向上のため役職や班をシート上で定義する
  • Google ContactsというGoogleの電話帳の方がフィルタリングがしやすそうなのでそっちで管理する

会員チェックリスト

名簿管理システムと連携して会議の出欠や作品の提出のチェックをするシステムです。
とはいえただチェックするだけなのでそこまで機能はありません。

班や役職ごとにシートが分けられていてそれぞれシートごとに権限を割り当ててます。
スプレッドシートには外部のスプレッドシートからセルをインポートする機能があり、それを使って名簿管理システムからデータを引っ張ってきてます。
そのデータの所属班を元に班で振り分けています。

現時点では横断的な検索がしづらいため名簿管理システムと統合しようと考えています。

教室申請システム

教室申請における申請ミスの防止、連絡の手間軽減を目的として開発しました。
また総コンは毎月活動教室として教室を大量に申請するので、教室番号の入力の手間を省く狙いもあります。

以前は紙で貰った許可証からGoogleカレンダーに手打ちでイベントを作ってそれをスクリーンショットして…という非常に手間のかかる作業をしていました。
( 本当は紙じゃなくてWeb上で申請ができれば一番なんだけど… ) 活動教室以外のイベントも担当者に直に連絡したり勝手に事務に申請しにいってたので、同じサークル内で知らないうちに講座が開かれているという状況が発生してました。
そこで全ての教室申請がシステムを通すことで全員がイベントを把握できる環境を作りました。

教室申請の流れ

  1. 教室申請フォームから申請する
  2. Slackに通知がくる
  3. 申請がスプレッドシートに書き込まれる
  4. 申請に問題がなければ事務に申請しにいく
  5. システム上で申請を提出済にしておく
  6. 事務から紙で返ってくる
  7. システム上で教室番号を入力する
  8. 自動でGoogleカレンダーのイベントが生成される
  9. Slackに通知される

イベントは全てGoogleカレンダーで管理しています。
活動教室申請はフォームが不要なだけで後は同じです。
お気づきかもしれませんが、当システム→紙→事務のシステム→紙→当システムという大変非効率な流れを踏んでおります。

Tips: フォーム

  • Slackユーザ名を入力させることで申請者への通知を可能にする
  • イベント詳細欄を設ける
  • 申請が来たことをSlackで通知する

Tips: スプレッドシート

  • 教室番号と規模の対応表、時間と時限の対応表を作りそこから参照することで仕様変更に耐える
    • 教室番号や時限を選ぶ時に、プルダウンメニューの候補をここから自動生成している
    • 教室が増えることはそうそうないが、時限は実際に今年度から90分から100分授業になったのでありうる話
  • 紙を提出したこと、回収したことも入力させる
  • 申請済みの行は非表示にする

展望

  • 毎月教室が貸し出せない日があり、その日に申請がきた場合エラーを返す
    • ただデータを入力する手間が増える
  • 活動教室の申請をより効率化する

カツ丼屋

活動教室(カツ丼)の一覧を生成するシステムです。
カレンダーのイベントだと見づらいので時限ごとに表で閲覧できるようにしています。
基本的にはイベントの開始/終了時刻から当てはまる時限に教室番号を割り当てているだけです。
また講座などのイベントの一覧も生成します。

機能

  • 今日/今月/来月の教室一覧
  • 今月のイベント一覧

Tips

  • こちらも同じく時限対応表を使用
  • トリガーを設定し全自動で動かす
    • 当日は1日1回、当月は月1回自動で一覧を更新する
  • 現在の時限をハイライトする
    • 時限と時限の間を仮に設定することで間の時間もハイライトする

カツ丼屋Webアプリ

GASにはWebアプリとして動的ページを作れる機能があります。
カツ丼屋ではスプレッドシートからインポートしてWebページを生成しています。
しかしスプレッドシートと違ってリアルタイムに更新されずロード時のみ更新されます。

こんな感じで動いてます。

展望

  • Webアプリのスマホ対応
  • 活動教室を更新したら自動的に一覧を更新する
    • 他のスプレッドシートにある任意の関数を実行することは技術的にできないので、何らかのトリガーを踏ませて間接的に実行させる必要がある

あとがき

今回は開発した4つのシステムがどんな感じで動いているかまとめました。
まだ実際のスクリプトを公開していないので、文字だらけの記事になってしまい仕組みが掴みづらかったかもしれません。

総コンの役職を18年1月で引退するので、それまでにやれるだけ展望に書いたとこを実践してみようと思います。
引継のことをあまり考えずに組んでしまったのでかなりアンリーダブルなコードになってます。
引継後ソースコードをMITライセンスで公開して、誰でも使えるように配布したいと考えてます。