問題の詳細
media パラメータを含む files.update() のリクエストが、誤ったエンドポイントに送信されてしまう。
→本来送られるべきエンドポイント(期待される挙動)
POST https://www.googleapis.com/upload/drive/v3/files/{fileId}
→実際に送信されているエンドポイント(現状の挙動)
POST https://www.googleapis.com/drive/v3/files/{fileId}
→結果
レスポンスは 200 OK で返されるが、ファイルの中身(content)は更新されない
再現手順
// 1. メタデータを用意
const metadata = {
'name': 'test-file.json',
'mimeType': 'application/json'
};
// 2. 空のファイルを作成
const createResponse = await gapi.client.drive.files.create({
resource: metadata,
fields: 'id'
});
const fileId = createResponse.result.id; // <- このIDを次のステップで使う
次に、返ってきたfileIdを使い、gapi.client.drive.files.update()をmediaパラメータ付きで呼び出し、ファイルの中身を更新しようとします。
// 3. 中身(media)を用意
const media = {
mimeType: 'application/json',
body: '{"message": "This content will not be saved."}'
};
// 4. updateを呼び出す(ここで問題が発生する)
const updateResponse = await gapi.client.drive.files.update({
fileId: fileId, // ステップ1で取得したID
media: media
});
原因の分析
上記のステップでコードを実行し、デベロッパーツールで通信を確認したところ
mediaを含んだfiles.updata()のリクエスト先エンドポイントは以下のようになっていました。
・期待されるエンドポイント → upload/drive/v3/files/{fileId}
・実際のエンドポイント → drive/v3/files/{fileId}
つまりmediaを含むupdate()が、metadata更新用のエンドポイントに送られてる状態です。
これが今回のupdate()でmediaが反映されない根本原因だと思われます。
またレスポンスが200okと帰ってくるのは
「意図と違うコードが正しく実行されている」
ためです。
※なお、resource パラメータは問題なく使えるため、metadata の更新は可能です。
現在の状況としては、update() 関数は実質的に metadata 更新専用となっており
media は無視されてしまっています。
回避策
driveAPIドキュメントの仕様に沿ってgapi.client.recuestを使用し、httpリクエストを送る。
_____________________________________
問題報告はここで終わりですが、以下に自分がこれを発見した過程と、なぜこの問題が“初心者にとって重大な罠”なのかを書いていきます。
この問題が発見しにくい理由
createを使ってもマルチパートアップロードはできないので
files.createで空のファイル(metadetaのみ)を作成し、files.update()で中身(media)を追加するという流れがあったのですが、このときfiles.create()だけが正常に動きupdate()だけが上手く動きませんでした。
でもこれで「gapiライブラリバグがある」と気付けるひとって正直かなり少ないと思います。
おそらく99%の人がこう考えるはずです。
・update関数の書き方がおかしかったのか?
・自分のコードがドキュメント通りじゃない?
・非同期処理のタイミングミス?
とにかく「自分側のミスでは?」という前提で試行錯誤し始めると思います。
「Google Drive API のドキュメントをちゃんと読めばいいんじゃない?ドキュメントを読まなかった自分の怠慢じゃないか?」
途中そう思ったこともありましたが、実際に理解した後に言えることは
「update()の送信先エンドポイントが間違っているのは、シンプルだけど重大な欠陥」
であるということ。
何が重大なのか
・files.update() を使って media(ファイルの中身)を更新できない。
・media を files.update() に渡しても、200 OK が返ってくるだけで中身は更新されない。
・AIはこの問題に気づけない。
AIに「Google Drive API のドキュメントに沿って request() を使ってください」と指示すれば正しいコードを返してくれますが、
初心者が最初からそんなピンポイントな質問をするのは難しいです。
多くのAIは、Drive API のドキュメントに準拠したコードではなく、gapi ライブラリを使って以下のようなコードを提案します:
gapi.client.drive.files.update({
fileId: fileId,
media: media,
fields: 'id'
});
このコードは 文法的には正しく、エラーも出ず、200 OKと返るため、AIは問題があると判断できません。
その結果、AIたちは次のような「改善提案」を繰り返します:
・ユーザー側のPC環境の問題かもしれない
・非同期処理のタイミングかも?
私は3種類のAI(Claude・ChatGPT・Gemini)で試しましたが、全員「改善案」は出すものの、本質的な原因を突き止めることはできませんでした。
ここからの思考
Drive APIのドキュメントに沿ったコードに書き直せば、mediaのアップロード自体は可能であると知った。
しかし「なぜ update() に media を渡すと無視されるのか?」という疑問は解消されず、ググっても情報は見つかりませんでした。
そこで、すべての可能性を自分で潰して、最後に出た結論がこれでした。
「俺のコードがおかしい以外に理由がない」
という結論になったんです。当時はまだ「gapi ライブラリに不具合がある」とまでは思い至っていませんでした。
「改善案は全て試しました。最後に、自分のコードが正しいかどうかだけを教えてください。」
すると初めて、Claudeが「ライブラリの挙動とドキュメントに乖離があるかもしれない」と返してきたんです。
AI時代の罠
今回のような問題に初心者がぶつかった場合、AIに相談しても 絶対に答えにたどり着けません。改善案に惑わされて、延々と自己修正を繰り返すことになります。
その後の検証でわかったこと
・エンドポイントが/upload でないため、mediaが無視されている
・それでも200 OKが返るため、一見すると“正しく動いてるように見える
・結果的に、間違ったコードが正しく実行されたように見えるというサイレントバグ状態になっている
ということが実際に開発者ツールを確認して判明したのだ。
これは経験不足な自分の浅い予想だが、update関数のmediaを渡したときのエンドポイントが正しいものに修正されれば、難しいdriveapiドキュメントに沿ったコードを書かなくても保存できるようになるのかなって思っている。エンドポイントを修正するだけなら割と簡単に修正できるのでは?と経験が浅いせいで思ってしまっている。
報告する価値があると思って報告しているが、既知の事実であればすみません。
【Environment】
- Google API Client Library for JavaScript
- Loaded via: https://apis.google.com/js/api.js
- Browser: Chrome 137.0.7151.104 (Official Build) (64-bit)
- OS: Windows 11
この記事は 2025/06/25 に、Google API JavaScript の issue に英語で投稿した内容を、Qiita向けに少し編集したものです。
→【https://github.com/google/google-api-javascript-client/issues/1404】
issue投稿から約3週間後、かなりピンポイントにAI に質問したところ、実は Stack Overflow で 2016年に同様の問題が一度報告されていた ことがわかりました。
※ピンポイントで検索しないと出てこないから普通に調べたら出てきません。あと英語です。
ただその投稿は「原因の特定」ではなく、「Drive API ドキュメントに沿って書けば回避できる」という内容でした。
しかも当時は update() に media を渡すと エラーが出ていた ようです。
そんな前からあるんかい!って思いました。
そして、時の流れでエラーも出なくなってるの、本当に厄介ですね。
記憶が少し薄れかけていますが、強く残っている気持ちとしては
・update() で media を使えないなら エラー出してくれ!
・update() で media が使えないなら ドキュメントにちゃんと書いてくれ!
って感じです。これがこの問題のまとめみたいなものですね。
GitHub の issue は英語ということもあり拡散力が弱く、
日本語でこの情報にたどり着ける人は限られていると感じました。
なので、同じような問題にハマる開発初心者の人たちの助けになればと思い、Qiita に投稿しました。
私自身もまだ初心者の部類なので、認識のズレや間違いがあるかもしれませんが、
この記事が少しでもお役に立てれば嬉しいです!