Google Apps Script x Google APIs の高速連携方法
Google Apps Script と Firebase App Distribution API の連携例として
背景
以前、Google Apps Script を使った記事をいくつか書きました。その中で「Google Apps Script を使った毎日データレポートの RPA 自動化」や「簡単 3 ステップ — 無料 GA4 自動データ通知ボットの作成」では、Google Apps Script を使って Google Analytics と Google Sheet、Web App、Slack、Telegram を連携し、視覚化されたデータプラットフォームや通知サービスを素早く構築する方法を紹介しました。また、先月公開した記事「Google Apps Script Web App フォームで Github Action CI/CD を連携」では、Google Apps Script Web App を使って Github API と連携し、CI/CD の GUI フォームサービスを実装しました。これらはすべて Google Apps Script の組み込みサービスや外部サービス(Slack、Github など)を直接連携しており、Google APIs を使う場面はありませんでした。
今回、CI/CD GUIフォームを最適化する際に、内テスト版をパッケージ化した後、Webアプリ上で直接Firebase Distributionのダウンロードリンクを表示したいと考えました。これを実現するにはGoogle APIsを連携する必要があります。
Google Apps Script x Firebase App Distribution API v1

上図のように、従来の Google Analytics の組み込みサービス「AnalyticsData」とは異なり、Firebase App Distribution は組み込みの接続サービスを提供していないため、進階的な方法で接続する必要があります。
もともと Service Account を使って Access Token の生成や交換を自分で行う必要があると思っていた(少し面倒、以前の 評価ロボットのオープンソースプロジェクト を参照)が、実はそれほど面倒ではない。
Google Apps Script x Google APIs 高度なサービス連携
連携設定
参考 公式ドキュメントの説明 に従い、以下の手順で高度な設定を行う必要があります:
-
スクリプトプロジェクトで 高度なサービスを有効にする 必要があります。
-
スクリプトで使用している Cloud Platform (GCP) プロジェクト で、対応する進階サービスの API が有効になっていることを確認してください。
-
もしスクリプトプロジェクトが2019年4月8日以降に作成されたデフォルトのGCPプロジェクトを使用している場合、進階サービスを有効にしてスクリプトプロジェクトを保存すると、APIは自動的に有効になります。まだ同意していない場合は、システムがGoogle CloudおよびGoogle APIの利用規約への同意を求めることがあります。
-
もしスクリプトプロジェクトが標準GCPプロジェクトまたは古いデフォルトGCPプロジェクトを使用している場合、GCPプロジェクト内で対応するAPIを手動で有効化する必要があります。変更を行うにはGCPプロジェクトの編集権限が必要です。
1. プロジェクト設定 — 関連付ける Google Cloud Platform (GCP) プロジェクトの設定
Google Apps Script x Google APIs の高度なサービス連携では、GCP プロジェクトを作成し、それを Google Apps Script に関連付ける必要があります。Google APIs の使用権限は GCP の設定に従います。
したがって、GCP プロジェクト(Firebase の GCP プロジェクトでも可)を作成し、情報ページの「プロジェクト番号」を控え、この GCP プロジェクトで使用したい Google APIs が有効になっていること、そして現在ログインしているアカウントまたは使用したいアカウントがその GCP プロジェクトおよび Google APIs の権限を持っていることを確認してください。


本記事では「 Firebase App Distribution API 」を例にしています。

プロジェクト番号 を Google Apps Script プロジェクト設定の下にある Google Cloud Platform プロジェクト番号に入力すると、現在ログインしているアカウントにその GCP プロジェクトの権限があれば、自動的にバインドされ設定が完了します。
2. プロジェクト設定 — エディタで「appsscript.json」マニフェストファイルを表示する

有効化後、エディタに戻るとファイル一覧に「appsscript.json」設定ファイルが表示されます:

oauthScopes に以下の2つの記述が含まれていることを確認してください:
"oauthScopes": [
"https://www.googleapis.com/auth/script.external_request",
"https://www.googleapis.com/auth/cloud-platform"
]
もし保存されていない場合は、手動で貼り付けて保存してください。
3.接続コードの作成
GCP プロジェクトを設定したら、連携コードの作成を開始できます。連携したい Google APIs の公式ドキュメントを直接参照してください。 Firebase App Distribution API v1 :

const project = "projects/[Firebase Project ID]/apps/[Firebase APP ID]"; // あなたの Project ID と App ID に置き換えてください
function debug() {
const releases = firebaseDistribution("");
releases.forEach(function(release) {
// リリースオブジェクト: https://firebase.google.com/docs/reference/app-distribution/rest/v1/projects.apps.releases?hl=zh-tw#Release
Logger.log(`${release.name} ダウンロードURL: ${release.testingUri}`);
});
}
function firebaseDistribution(releaseNote) {
const url = "https://firebaseappdistribution.googleapis.com/v1/"+project+"/releases?filter=releaseNotes.text%3D*"+releaseNote+"*";
// フィルター: https://firebase.google.com/docs/reference/app-distribution/rest/v1/projects.apps.releases/list?hl=zh-tw
const headers = {
"Content-Type": "application/json; charset=UTF-8",
"Authorization": "Bearer " + ScriptApp.getOAuthToken(), // 現在のアカウントのトークンを直接使用
};
const options = {
"method": "get",
"headers": headers
};
const data = UrlFetchApp.fetch(url, options);
const result = JSON.parse(data.getContentText()).releases;
if (result == undefined) {
return [];
}
return result;
}
[Firebase Project ID] と [Firebase APP ID] は Firebase プロジェクトの設定で取得できます:

コードを貼り付けた後、初回実行時に権限の承認が必要です。


-
「権限の確認」をクリックしてください。
-
実行するアカウントを選択します。通常は現在の Google Apps Script アカウントと同じです。


-
「詳細設定」を展開 -> 「XXX に移動」をクリック
これは自分たち自身で使うアプリケーションなので、Google の認証は不要です。 -
「許可する」をクリックしてください
上記の画面は必ず表示されるわけではなく、表示されない場合は無視してください。
許可後、次回から「デバッグ」や「実行」をクリックするだけでプログラムを実行できます:
エラーが発生した場合:
Exception: https://firebaseappdistribution.googleapis.com へのリクエストがコード403で失敗しました。サーバーの応答は省略されています: {
"error": {
"code": 403,
"message": "リクエストに認証スコープが不足しています。",
"status": "PERMISSION_DENIED",
"details":... (muteHttpExceptionsオプションを使用して完全な応答を確認してください)
...
または
Exception: UrlFetchApp.fetch を呼び出すための権限が不足しています。必要な権限: https://www.googleapis.com/auth/script.external_request
appsscript.json の oauthScopes に以下の2つの記述が含まれていることを確認してください(手順2を参照):
"oauthScopes": [
"https://www.googleapis.com/auth/script.external_request",
"https://www.googleapis.com/auth/cloud-platform"
]
エラーが発生した場合:
Exception: https://firebaseappdistribution.googleapis.com へのリクエストが失敗し、コード401を返しました。省略されたサーバーレスポンス: {
"error": {
"code": 401,
"message": "リクエストに無効な認証資格情報が含まれていました。OAuth 2アクセストークン、ログインクッキー、またはその他の認証情報が必要です...(muteHttpExceptionsオプションを使って完全なレスポンスを確認してください)
まだバインドされていない GCP プロジェクトを示しています(ステップ1を参照)。または、その GCP プロジェクトで使用したい Google APIs が有効になっていない、現在のアカウントに該当の GCP / Google APIs の使用権限や Firebase App の権限がない場合があります。設定を確認してください。
エラーが発生した場合:
Exception: https://firebaseappdistribution.googleapis.com へのリクエストが失敗し、コード 404 が返されました。サーバーの応答は省略されています:
または
Exception: https://firebaseappdistribution.googleapis.com へのリクエストが失敗し、コード400が返されました。サーバーレスポンスの一部: {
"error": {
"code": 400,
"message": "リクエストに無効な引数が含まれています。",
"status": "INVALID_ARGUMENT"
}
}
Google APIs のリクエストパスが正しいかどうか確認してください。
連携成功🎉🎉🎉

短くて10行未満のコードでGoogle APIsをスムーズに連携できるのは本当に便利です。興味のある方は、比較として 自作 のGoogle APIs連携時の認証トークン交換の手順を見てみると、その煩雑さがよく分かります。
次のステップ:
以前の記事「 使用 Google Apps Script Web App フォームで Github Action CI/CD ワークフローを連携 」と組み合わせて、Firebase App Distribution のダウンロードリンクも Web App に表示し、メンバーが直接ダウンロードできるようにしました。

デモ結果
他の Google APIs も同様に接続可能です。
2025/07 更新:
この機能は実際のパッケージングツールに統合されています。最新の記事事例もご参照ください:「 CI/CD 実践ガイド(4):Google Apps Script Web App を使って GitHub Actions と連携し、無料で使いやすいパッケージングツールプラットフォームを構築する 」
Post MediumからZMediumToMarkdownを使って変換しました。



コメント