0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

橋は配れないので、架け方を配ることにした ── 鍵の要らないGAS中継器をGitHubで公開した話

0
Posted at

はじめに

白状から始めます。この連載は本来、コードの現物を公開しながら書いていくつもりのものでした。ところが振り返ると、ここのところ話ばかりで、GitHub に新しいものをしばらく上げていませんでした。書きたいことが続いたのだと言えば聞こえはいいのですが、現物を待っていた方には申し訳ない話です。

今日は久しぶりに、現物があります。

Excel VBA から、API キーをどこにも書かずに YouTube Data API を呼ぶための中継器(GAS ウェブアプリ)です。前回、眠っていた YouTube 一覧ブックがこの中継器で生き返った話を書きました。

今回はその続きで、あの中継器を配れる形に仕上げて公開するまでの話と、それから、同じ手を隣のサービス──Google の Gemini──に向けてみたら通じなかった、という検証の現在地の話です。

TL;DR

  • GAS 中継器を GitHub で公開しました。主役は中継器のコード約140行で、Excel ブックは「活かし方の見本」として同梱しています
  • ただし配っているのは中継器そのものではなく、作り方です。設置した中継器の URL とパスワードは設置した本人専用で、人に配るとその人の API 割り当てが又貸しされてしまうからです
  • 公開前の仕上げで、ブックに残っていた多段の API 呼びを全部1往復に畳みました。最新50件の取得が実測 4.49秒 → 2.74秒になりました
  • GAS はまれに一時的なエラーを返します。最大3回撃ち直す網を入れたら、たまの空振りが消えました
  • 同じ「鍵を消す」手を Gemini に試したら、承認画面で門前払いでした。YouTube と Gemini では認証の設計が違います
  • Gemini 無料枠の実測は 1日20回。それでも Excel と組ませる道を、いま検証している最中です

公開したもの ── 主役は中継器、ブックは見本

リポジトリの中身は5点だけです。

vba-gas-relay/
  README.md              ← 設置手順(約5分)と落とし穴
  gas/relay.gs           ← 中継器本体(約140行)
  gas/appsscript.json    ← 権限の指定(読み取り専用)
  excel/ユーチューブ最新情報.xlsm  ← 活用サンプル
  LICENSE

中継器の窓口は3つあります。

呼び方 働き
?tk=…&q=channels?part=… 汎用中継。API の URL をそのまま転送する
?tk=…&mode=latest&channelId=UC… 最新50件を GAS 側で集め切り、1往復で返す
?tk=…&mode=list&channelId=UC… チャンネルの全動画を集め切り、1往復で返す

仕組みは前回書いたとおりです。GAS は YouTube Data API を標準装備していて、キー取得もカード登録も要りません。それをウェブアプリとして公開すると URL が1本生え、VBA からその URL を叩く。認証は GAS が、設置した本人の Google アカウントの権限でやってくれます。API キーは、ブックにも GAS にも存在しません。

Excel ブックのほうは、チャンネルを指定すると全動画のタイトル・再生回数・長さ・投稿日時を一覧にする自作ブックの公開版です。シートの M1 セルにチャンネル ID を書いてボタンを押すだけ。シートを複製すれば監視するチャンネルを何個でも増やせます。中継器がどう活きるかの、動く見本という位置づけです。

橋そのものは配れない

公開の設計で、いちばん考えたのはここでした。

この中継器は、いわば Excel と Google のあいだに架けるです。そして橋は、架けた本人しか渡ってはいけない作りになっています。中継器の URL(住所)とパスワード(合言葉)を人に教えると、その人の通信が全部こちらの橋を渡る──つまり自分の Google アカウントの API 割り当てが、他人に使われることになるからです。

橋は配れない

だから配るのは橋ではなく、橋の架け方です。README に設置手順を書きました。所要はおよそ5分です。

架け方を配る

  1. script.new で GAS プロジェクトを作る
  2. relay.gs を丸ごと貼り、先頭の TOKEN を自分で決めたパスワードに書き換える
  3. appsscript.json を差し替える(読み取り専用の権限指定)
  4. ウェブアプリとしてデプロイする
  5. 生えた URL とパスワードを、ブックの VBA 先頭2行に書く
Private Const GAS_URL   As String = ""   ' 中継器の URL(住所)
Private Const GAS_TOKEN As String = ""   ' 中継器に書いたのと同じパスワード(合言葉)

面白いもので、こうして URL とパスワードは自分用です、配らないでください、と書いていると、公開物そのものが鍵の管理の教材みたいになってきます。世の中には API キーをコードに直書きしたまま公開されたリポジトリが山ほどあって、あれは事故です。これはその逆──鍵をどこにも書かないための道具を、鍵の代わりに何を守るべきかの注意書きごと配る形になりました。

仕上げ① ── 残っていた往復を、全部畳む

公開するとなると、自分用のままでは出せません。仕上げが三つありました。

一つ目は速さです。前回の記事で「ループを GAS 側へ移して往復56回を1回にしたら、107秒が13.8秒になった」と書きました。ただ、あれは全動画一覧という看板機能だけの話で、他のマクロは多段呼びのままでした。最新50件の取得は、チャンネル情報→動画ID→動画詳細の3往復。中継は1往復ごとに約2秒の通行料を取るので、3往復ならそれだけで6秒級です。

公開前に、これを全部畳みました。中継器に mode=latest という窓口を足して、3往復ぶんの仕事を GAS 側で済ませ、整形済みのデータを1往復で返す。「直近3日ぶんだけ」のような日付の絞り込みも GAS 側でやってしまい、必要な行だけ受け取ります。

実測です(2026年8月、同一チャンネルで計測)。

操作 畳む前 畳んだ後
最新50件の取得 4.49秒(3往復) 2.74秒(1往復)
直近3日の抽出(1シート) 3往復 2.10秒(1往復)
全動画1,388本の一覧化 13.84秒(前回時点で1往復済み) 12.58秒

最新50件で2.7秒。残りの差はほぼ GAS を1回経由する固定費なので、このあたりが床だと思います。全動画のほうは本数なりの時間で、これは動画が2,000本あれば延びる性質のものです。

往復の数だけが速さを決める──前回つかんだこの原理を、今回はブックの全マクロに行き渡らせた、ということになります。

仕上げ② ── たまに来るエラーに、網を張る

二つ目は安定です。使い込んでいると、たまに取得が無言で空振りすることがありました。

正体は GAS の癖です。GAS のウェブアプリは、ごくまれに一時的な 404 や HTML のエラーページを返すことがあります。こちらのコードは1回撃って駄目ならそれっきりの作りだったので、HTML が返ってくるとデータとして読めず、静かに空振りしていました。

網を張りました。正常な応答が来るまで最大3回、2秒待って撃ち直すだけの単純な網です。

For tryN = 1 To 3
    http.Open "GET", GAS_URL & "?tk=" & GAS_TOKEN & "&mode=latest&channelId=" & channelId, False
    http.Send
    res = http.responseText
    If http.Status = 200 And Left(res, 1) <> "<" Then Exit For  ' HTMLでなければ通す
    If tryN < 3 Then Application.Wait Now + TimeSerial(0, 0, 2)
Next tryN

正常時は1回で抜けるので、速さは変わりません。これを入れてから、体感ですが空振りは出なくなりました。README にも「自作するときも、この網は入れておくことをおすすめします」と書いてあります。前回書いた ServerXMLHTTP の話(MSXML2.XMLHTTP は GAS のリダイレクトを蹴る)と並ぶ、この中継方式の二大落とし穴だと思います。

仕上げ③ ── 鍵を抜いても、死なない作りにする

三つ目は配布の作法です。公開版のブックは GAS_URLGAS_TOKEN を空にしてあります。では空のままだとどうなるか。

従来どおり「自分の API キーを貼って直接呼ぶ」方式に、自動で切り替わります。 通信が全部通る関数の入口に「GAS の URL が設定されていたら宛先を付け替える」分岐がある、前回書いたあの作りのおかげです。中継器を建てるのは面倒だけれど API キーなら持っている、という方はキーを貼れば同じブックがそのまま動きます。どちらの道も生きているのが、この公開版の仕様です。

公開前の検品では、配布ファイルのコピーに自分の中継器の URL とパスワードを書き込む──つまり受け取った人と同じ手順を踏んで、全機能を実機で押しました。最新50件2.74秒、全動画1,388本12.58秒、検索、お気に入り。この数字は、その検品のときのものです。

隣の川 ── Gemini に同じ手を試している話

さて、ここからは現在進行形の話です。

YouTube で鍵が消せたのなら、生成 AI でも消せないか。つまり Google の Gemini を、API キーなしで Excel から呼べないか。同じ橋の架け方を、隣の川に向けてみました。

結論から書くと、同じ手は通じませんでした。

この川はまだだ

GAS が自分の権限で API を呼ぶには、そのサービスの OAuth スコープ(権限の名札のようなもの)が要ります。YouTube にはそれがあった。Gemini 用のスコープを指定してみたら、承認画面で「エラー 400: invalid_scope」──そういう名札は存在しない、という門前払いでした。YouTube API は OAuth でも呼べる設計、Gemini API は基本的にキーで呼ぶ設計。同じ Google でも、川の形が違ったわけです。

なので Gemini では、鍵そのものは消せません。ここで現在地を正直に並べます。

  • API キーは取りました。 無料枠の実測は、使えるモデルが gemini-2.5-flash のみで、1日20回。日本時間の16時ごろにリセットされます。速度は空いていれば VBA からの直呼びで平均0.72秒と上々ですが、混むと2〜8秒に絞られます
  • キーを運ぶ中継は動きました。 GAS 中継越しに日本語の往復まで確認済みです。ただしこちらは鍵が消えたわけではないので、YouTube のときのような「配れる形」にはまだなっていません
  • 調べて分かったこととして、Gemini のチャット版の有料契約を持っていても、API の枠は別物です。契約すれば VBA から呼び放題、とはなりません
  • 別の道として、API を使わずにブラウザの Gemini を自動操縦する実験もしました。プロンプトを送って回答を受け取るまで、画面なしで実測14.3秒。1日20回の壁はこちらにはありません

要するに、Google の Gemini と Excel VBA を組ませられないか、いま検証している最中です。 鍵は消せない。無料枠は薄い。それでも道が何本かあることまでは分かってきた──今日はそういう途中報告までです。研究が形になったら、また現物と一緒に書きます。

橋脚は、どこへでも

最後に、少しだけ風呂敷を広げます。

今回公開した中継器は、転送先が YouTube に向いているだけです。GAS が標準で持っているサービスは他にもあって、Gmail も、ドライブも、カレンダーも、翻訳も、同じ約140行の型で Excel から届く理屈になります。デプロイした GAS は URL を持つ。URL は VBA から呼べる。この2つが成り立つかぎり、GAS は Excel から Google のサービス群への口になれます。

ここは正直に、まだ理屈です。実物があるのは YouTube と、検証中の Gemini だけ。ただ、橋の架け方は一度覚えれば使い回せます。川は、これから一本ずつ渡るつもりです。

事実と見立ての仕分け

例によって仕分けます。

事実:リポジトリを公開したこと(構成は本文のとおり)。最新50件の取得が3往復4.49秒→1往復2.74秒、直近3日の抽出が1シート2.10秒、全動画1,388本が12.58秒であること(2026年8月の実測)。GAS がまれに一時的な 404 や HTML エラーページを返すこと(実際に踏みました)。Gemini 用の OAuth スコープ指定が「エラー 400: invalid_scope」で拒否されること(実物の承認画面で確認)。gemini-2.5-flash の無料枠が1日20回で、超過後に 429 が返ること(実測)。ブラウザ自動操縦の往復が画面なしで14.3秒だったこと(実測)。

見立て:最新50件の2.7秒を「ほぼ床」と見ていること(固定費の構造からの推測です)。撃ち直しの網で空振りが消えたという体感(消えた回数を数えたわけではありません)。「同じ型で Gmail もドライブも届く」は、YouTube で成立した理屈の延長であって、まだ実物を作っていません。

正直な線引き

  • 設置した中継器の URL とパスワードは設置した本人専用です。配ると自分の API 割り当てが他人に使われます。リポジトリが配っているのは作り方であって、誰かの中継器ではありません
  • パスワードはブックを開けば読める場所に書く方式です。漏れても公開データの読み取りしかできない構成(読み取り専用の権限・エンドポイントの許可リスト)が前提です
  • サンプルブックは、URL もキーも入れないまま取得ボタンを押すと何も言わずに0件で終わります。エラー表示は付けていません。最初に取説シートの「接続の設定」をご覧ください
  • キー直挿し方式(方式B)のコードは以前実際に使っていたものをそのまま残していますが、公開版での通し実測は中継方式(方式A)で行いました。方式Bは新しいキーでの再実測まではしていません
  • Gemini の無料枠の数字は2026年8月時点の、私のキーでの実測です。枠の値は変わることがあります
  • GAS の無料枠(YouTube API 換算で1日1万ユニット)と、ストリーミング非対応の話は前回の記事のとおりです

解説動画

この記事の内容は、動画でもまとめています。本文の差し絵は、もともとこの動画のために描いたものです。

解説動画のサムネイル

おわりに

久しぶりに現物を置けました。

自分用の道具を配れる形にする作業は、思ったより設計の話でした。速くするのは畳む話、安定させるのは網の話、そして何を配って何を配らないかは、橋の話。URL とパスワードだけは渡せないから、架け方を全部書いて渡す──公開の形として、これがいちばん筋が通っていると思っています。

川は、まだ何本もあります。

それでは、また。

と、一旦締めましたが、その後にいろいろやってみたらすごいことができちゃったかもしれません。
また明日発表しますね!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?