2023/07/03

何のために週報をするのか

こんにちは、㉔です!

皆さん週報書いているでしょうか?一週間の業務内容や到達度、目標とかを書くあれです。週報書くのって面倒くさい大変ですよね。しかし自分の作業内容を客観視できる機会ですし、PMやPLは一人ひとりに状況を聞いて回れるほど余裕が無いことが多いです。そんな中で週報はメンバーの状況を把握できる重要な情報源です。日報の重要性は世界的なゲームクリエイター桜井政博さんのお墨付きです。

https://youtu.be/cvIauz7IK0E

Az OneのPhilosophyと週報

HPにもある通り、Az Oneのphilosophy(大切にしている考え方)は『エンジニアの想いを実現する』です。(ちなみに、理念は【理想をカタチに】)
philosophy実現のための手段の一つとして週報によるエンジニア個人の状況把握を実施しています。Az Oneの週報は業務状況の把握だけでなく現場の雰囲気、モチベーションの状態なども回答してもらっています。単なる業務の進捗管理だけでなく、エンジニア個人の目標と現状が乖離しないことをAzOneではとても大切にしています。(なので、AzOne社員の皆さん、面倒くさがらず書いて下さい🙏読んでるので!w)

週報管理の構成

GAS(Google Apps Script)を用いて金曜(その週の最終の平日)にGoogle Formsで週報の回答用フォームを生成し、そこへのリンクをWebhookを利用してDiscordへ通知しています。また、週報の回答を収集して対処すべき内容をマネージャー層へ通知しています。これにより社員個人のアラートへ早期に対処できるよう運用しています。

これらは全てGASの定期実行機能により全て自動で実行されます。GASを触ったのは今回が初めてでしたが、小さい会社でちょっとしたツールを作るにはかなり有用なツールだなという印象です。

GASのベストプラクティス

GASの夜明け

GASは2020年2月6日にV8ランタイムをサポートし、ECMA Scriptが使えるようになりました。つまるところ普段我々フロントエンドエンジニアが書いているモダンJavaScriptと同じスタイルでコードを書くことが出来るようになったということです。

この発表がなければ社内ツールにGASを採用することはなかったでしょう、それくらいインパクトのある内容でした。

GASの管理

GASはGoogleの提供するオンラインエディタ上にコードを書くことで各種スクリプトを管理しています。そのためVSCodeやvimでGASのコードを直接書くことはできませんし、GAS自体に履歴の管理機能はありません。(一応Google Driveの履歴機能はありますが差分は見れないので実用には耐えない)

コードを書くとき履歴管理(Git)無しというのは、ブレーキの壊れた自転車で出発するようなものです。当然何かしらの方法で管理する必要があります。

Claspは全てを解決する

Clasp(Command Line Apps Script Projects)はGASをローカル環境で開発するためのGoogle製コマンドラインツールです。こいつで全てが解決します、全部です。

インストール

npmからインストール可能です。yarnでも可能でしたがpnpmは未確認です。

npm install -g @google/clasp

ローカル開発の恩恵

clasp login
clasp push
 

clasp pushでGoogleアカウントにログインすることでGASの環境に接続できるようになります。これにより任意のコードをVSCodeやvimといった慣れ親しんだエディタで開発できるようになり、実装した内容はclasp pushでGASに反映させることでができます。

履歴管理自体はClaspの機能ではありません。ClaspによりGASをローカル環境で開発できるようになったことで、結果的にコードをGitHub等で管理できるようになります。

Az One内のGASの開発は基本的にClasp、VSCodeを標準ツールとして利用しており、コードはGitHubのプライベートリポジトリで管理しています。この構成によりコードの保守性はかなり上がりました。

機密情報の扱い

履歴管理をできるようになってくると、シークレットキーやWeb Hook URLなどの機密性の高い情報の管理が問題になってきます。GASのみで開発している場合はGoogleアカウントへの不正アクセスが無い限り、基本的にはGASのコードが外部に漏れることはありません。そのためコードに直接機密性の高い情報をベタ書きすることも可能ではありました。(それでも良くない方法です)

ただ、GitHubで管理するとなると話は変わってきます。ベタ書きした内容はそのまま保存されるため、もしpublicリポジトリにそのコードをpushすると全世界へ向けて機密情報を公開することになります。

スクリプトプロパティ

現状でのベストプラクティスは機密情報をGASのスクリプトプロパティで管理する方法です。スクリプトプロパティは環境変数のように扱えるkey-value pairsです。以下からアクセスできます。

  • GAS → プロジェクトの設定 →スクリプトプロパティ
コード内でスクリプトプロパティを使用する場合は以下のように使用します。

PropertiesService.getScriptProperties().getProperty('WORK_CHANNEL')

これでコード内に機密情報を保存せずにすむため、安全にGitHubでコードを管理することが可能です。当然アカウントへの不正アクセスがあると意味がないので、二段階認証などでアカウントは適切に管理しましょう。

 

Typescriptで開発したい

ここまででGASの開発はかなりモダンになりました。しかしエンジニアは欲張りなのでVanilla JS(この文脈でVanilla JSというのが正しいのか微妙)では満足できません。モダン開発に慣れている身としてはTypescriptで開発したくなってしまいます。結論から言うと当然可能です、Clasp様々です👏

Typescriptで開発する場合claspのバージョンは>= 1.5.0である必要があります。claspのバージョンは現時点で2.4.xなので、相当以前にインストールしていない限り気にする必要はないでしょう。

clasp -v

また、型定義に以下のパッケージの追加が必要です。

npm i -S @types/google-apps-script

Typescriptの設定(tsconfig.json)は以下を設定する必要があります。

{
  "compilerOptions": {
    "lib": ["esnext"],
    "experimentalDecorators": true
  }
}

 

また、現時点でclaspの対応しているTypescriptのバージョンは3.8.2です。最新のTypescriptの機能を利用することはできないのでその点も注意が必要です。

ちなみにAz OneではGASにTypescriptは採用していません。(当然業務ではTypescriptを採用しています)普段の開発では基本的にライブラリはできる限り最新のものを採用、適宜更新しています。そのため、最新のTypescriptの書き方とGASでの書き方で違いがあることは避けたかったというのがあります。ただ、最新の5.1.3と3.8.2で劇的に構文が変わるわけでも無いので、未だに採用すべきかは迷っていたりします。

最後に

GASは各PJで共通して利用できるライブラリ(日付に関する汎用関数などをチーム内で使い回す等)を作成することもできたりと非常に便利です。通常GASではnpmパッケージは利用できませんが、webpackを使って無理やりバンドルしてしまえばGAS内で利用することも可能です。(ちょっとやり過ぎな気もしますが)

小さい会社のちょっとしたツールを作るのであれば、Lambdaなどを利用せずGoogleアカウント内で完結出来るのは結構魅力的かなと思います。(Google Driveのファイルへのアクセスが簡単なのもよい)

また次の投稿をお楽しみに~~!!