はじめに
概要
作品名 | KPI収集システム |
制作期間 | 2024.01.17~2024.01.31 (15日) |
制作形式 | 受注制作 |
勤務先の社内用ツールのため、受注金額は0円
当作品は株式会社 ModelingX の所有物
リンク
システムの仕様
毎日23:00~24:00に1度、下記の値を取得して Google Spreadsheet に入力する。
- アプリのマルチプレイ用サーバーへの総アクセス数
- アプリ公式LPのPV数
- アプリ公式 Instagram アカウントのフォロワー数
- アプリ公式 Instagram アカウントのインプレッション数
- Android 版アプリのインストール数
- iOS 版アプリのユニット数(インストールしたユーザー数)
コンプライアンスの観点から下画像の各値は実際のアプリの値とは異なる
内容
出来るようになった事
Google Apps Script
- 「Sheet.getMaxRows()」を使用した、シートの最終行の取得
- 「Range.getNextDataCell()」を使用した、次のセルの取得
- 「Range.getRow()」を使用した、行の取得
- 「Range.setValue()」を使用した、セルへの値の設定
- 「AnalyticsData.newMetric()」を使用した、Metric の作成
- 「AnalyticsData.newDimension()」を使用した、Dimension の作成
- 「AnalyticsData.newDateRange()」を使用した、DateRange の作成
- 「AnalyticsData.newRunReportRequest()」を使用した、RunReportRequest の作成
- 「for」を使用した、繰り返し処理
- 「Properties.runReport()」を使用した、Google Analytics のレポートの取得
- 「parseInt()」を使用した、string 型から int 型への変換
- 「Array.length」を使用した、配列の要素数の取得
- 「string.slice()」を使用した、文字列の切り抜き
- 「continue」を使用した、次の繰り返し処理への移行
- 「encodeURI()」を使用した、URIのエンコード
- 「Date.setDate()」を使用した、Date の設定
- 「Date.getDate()」を使用した、日付の取得
- 「Date.getTime()」を使用した、時刻の取得
- 「Math.floor()」を使用した、小数点以下の切り捨て
- 「string.includes()」を使用した、「文字列内に特定の文字列を含むかどうか」の取得
- 「Utilities.formatDate()」を使用した、Date の特定の形式の文字列への変換
- 「Range.isBlank()」を使用した、「特定のセルが空白かどうか」の取得
- 「Utilities.parseCsv()」を使用した、CSVから2次元配列への変換
- 「Date.getFullYear()」を使用した、西暦の取得
- 「encodeURIComponent()」を使用した、URIの一部のエンコード
- 「三項演算子」を使用した、条件文の簡略化
- 「Date.getMonth()」を使用した、月の取得
- 「Array.join()」を使用した、配列内の全要素の結合
- 「Utilities.base64EncodeWebSafe()」を使用した、Base64 形式への変換
- 「Utilities.computeRsaSha256Signature()」を使用した、「RSA256」のシグネチャの取得
- 「Blob.setContentType()」を使用した、ファイル形式の設定
- 「Utilities.newBlob()」を使用した、ファイルの作成
- 「Blob.setDataFromString()」を使用した、ファイルへのデータの設定
- 「Utilities.ungzip()」を使用した、GZIPファイルの解凍
- 「string.split()」を使用した、文字列から配列への変換
- 「Array.push()」を使用した、配列への要素の追加
- 「Array.map()」を使用した、配列の全要素に対する処理の結果からの新たな配列の作成
- 「ラムダ式(=>)」を使用した、関数の記述の簡略化
- 「Math.max()」を使用した、最大値の取得
- 「スプレッド構文(…)」を使用した、配列の展開
Google Cloud Functions(.NET 8.0)
- 「readonly」を使用した、読み取り専用の変数の宣言
- 「ラムダ式(=>)」を使用した、メソッドの記述の簡略化
- 「HttpContext.Response.WriteAsync()」を使用した、レスポンスの入力
- 「ECDsa.Create()」を使用した、ECDsa の作成
- 「ECDsa.ImportPkcs8PrivateKey()」を使用した、ECDsa へのプライベートキーの設定
- 「Convert.FromBase64String()」を使用した、Base64 形式の文字列からバイト配列への変換
- 「DateTimeOffset.UtcNow」を使用した、現在の協定世界時(UTC)の取得
- 「DateTimeOffset.ToUnixTimeSeconds()」を使用した、UNIX時間の取得
- 「DateTimeOffset.AddMinutes()」を使用した、DateTimeOffset への分の追加
- 「JwtEncoder.Encode()」を使用した、JWTの取得
- 「string.Empty」を使用した、空の文字列の明記
- 「?」を使用した、Null 許容型の変数の宣言
- 「string.ReadLine()」を使用した、文字列の各行の取得
- 「Encoding.UTF8.GetBytes()」を使用した、文字列からバイト配列への変換
- 「Encoding.UTF8.GetString()」を使用した、バイト配列から文字列への変換
- 「string.Join()」を使用した、配列内の全要素の結合
- 「List.Skip()」を使用した、特定の要素番号以降の要素の取得
- 「List.Take()」を使用した、特定の要素番号以前の要素の取得
工夫した点
- App Store Connect API を使用するために生成する必要のあるJWT(RSA256)を取得するライブラリが Google Apps Script に存在しなかったため、.NET 8.0 の Visual Studio でコードを作成し、それを Google Cloud Functions に置き、それを Google Apps Script から呼ぶようにした事で、Google Apps Script でもJWT(RSA256)を取得できるようにした
- 取得する値の対象プラットフォーム毎にGSファイルを分ける事で、どのファイルにどんな処理が書かれているのかを分かり易くした
- Google Cloud の管理者アカウントで各APIを使用するのではなく、権限の限られているサービスアカウントで各APIを使用する事で、安全性を向上させた
- Slack のチャンネルに送信されたメッセージを取得する際、取得したメッセージをユーザーIDでふるいに掛ける事で、無関係なメッセージを取得しないようした
- 複数の関数で使用する値のみをメンバ変数にする事で、メモリの使用量を抑えた
- HTTPレスポンスのテキスト内に「error」の文字列を含んでいるかどうかで条件分岐させる事で、エラーの発生にも対応できるようにした
- セルへ値を入力したり、セルの値を取得したりする際に「parseInt()」を使用する事で、整数型として正常に処理できるようにした
- エラーや例外が発生する度に Slack へエラー内容を送信する事で、問題が発生しても正確に問題の内容を捉えて対処できるようにした
- Google Play Console のレポートを取得する際、「try-catch」を使用する事で、まだ今月分のレポートが生成されていなくても対応できるようにした