ダッシュボードはノート PC のブラウザでは問題なく開くのに、同じスプレッドシートのスクリプトはアドレスが利用できないというエラーで失敗します。VPN を切り替えても何も変わらないのは、リクエストがそもそもノート PC から出ていないからです。Apps Script は Google のインフラ上で実行され、そこから独自の接続を開きます。この一つの事実が設計全体を決めます。

何かを変える前に、二つの問いを分けてください。どのマシンがリクエストを送るのか、受信側はどの資格情報を受け入れるのか、という問いです。

リクエストはあなたのノート PC では始まらない

ブラウザのタブはノート PC から、VPN アダプター、社内 DNS サフィックスを経てプライベートサブネットへ送ります。 UrlFetchApp は Google が管理するホストから送ります。そのため Google のリゾルバーと Google の出口アドレスだけが見え、あなたのスプリットトンネルの経路は一つも見えません。二つの経路が共有するのはスプレッドシートの文書であって、ネットワーク上の位置ではありません。アプリのアクセスログでは、スクリプトの試行は VPN プールのアドレスではなく Google のアドレスとして現れます。これが得られる最も速い確認です。

だからローカルの修正は何の役にも立ちません。ノート PC を別のリゾルバーに向けても、VPN クライアントを再起動しても、hosts に項目を足しても、ブラウザの経路が変わるだけでスクリプトの経路は元のままです。

それが排除するもの

社内向けだけのエンドポイントには Apps Script から到達できず、IP の許可リストはこの位置ではアクセス制御の弱い代用品です。Google の出口範囲は広く、他の顧客と共有されていて、一つのスクリプトに紐づけることはできません。 UrlFetchApp のリファレンス は、リクエストが Google の IP プールから発信されると述べており、これがその主張の権威ある版です。社内アプリをこれらの範囲に開くことは、帰属できないトラフィックを受け入れることになります。

ブラウザのセッションも同じように振る舞います。ノート PC のブラウザにある Cookie や SSO セッションはリクエストと一緒に移動しません。リクエストはセッション状態を持たない新しい HTTPS クライアントです。ブラウザの SSO リダイレクトに依存するものは、あなたのデータではなくそのリダイレクトで終わります。

実行可能な二つの形

第一の形はスクリプトに承認済みの API を与えます。社内サービスを呼び出し元を認証するゲートウェイの背後に公開し、スクリプトにゲートウェイが受け入れる資格情報、たとえばサービスアカウントのトークンを提示させます。Apps Script では OAuth2 ライブラリか ScriptApp.getOAuthToken() を使い、API 側では IP リストではなく呼び出し元 ID の許可リストを持ちます。

第二の形は向きを逆にします。社内のジョブがプライベートシステムに問い合わせ、管理された結果をスクリプトが読む Sheet、Cloud Storage オブジェクト、BigQuery テーブルへ公開します。Cloud Run のジョブ、オンプレミスのスケジューラ、既存の ETL ステップのどれでもそのジョブになれますし、どれも内向きの接続を受け入れる必要はありません。スプレッドシートはインターフェースではなくデータセットを消費します。

どちらの形が勝つかは、鮮度、フィールド単位の制御、そして誰が読み手を監査できなければならないかで決まります。

公開された結果に含めるべきもの

逆向きのフィードには明示的な契約が必要です。運ぶフィールド、更新間隔、読み手のグループ、そして社内ジョブが失敗したときに何が起きるかです。この四つがなければ、スプレッドシートは昨日の数字を静かに表示します。生成されたタイムスタンプ列と行数を加えておけば、古い、あるいは部分的な公開がログを開かなくてもシート自体で見えます。

API の向きにも契約が必要です。ゲートウェイが受け入れる資格情報、トークンが持つスコープ、許可される呼び出し元 ID です。サインインページを含む 200 応答は成功した呼び出しではありません。ステータスコードだけでなく本文も確認してください。

エラーは正しい側から読む

Apps Script は到達できないホストをアドレス利用不可の例外として報告しますが、これはブラウザの接続拒否のメッセージではありません。ゲートウェイからの 403 は、リクエストが届いて資格情報かポリシーが拒否されたことを意味します。HTML のサインインページは、リクエストがスクリプトでは完了できない対話的な層に達したことを意味します。三つの異なる失敗と、三つの異なる責任者です。

スクリプトのログはブラウザの結果の隣に置き、片方をもう片方で置き換えないでください。残る問いは、その環境に必要なアクセスを与えるか、管理された結果を届けるかという、ごく普通の統合の判断です。

関連記事