【GAS】Cloud StorageのOAuth認証時に「Google ドキュメント内でエラーが発生しました。このページを・・・」が出てくる
はじまり




何が起こっているのか
今回は、Google Apps Script(GAS)で、Googleドライブにある画像をGoogle Cloud Storage(GCS)にアップロードするために、GCSを認証する時のお話です。
まあ、Google Cloud Platform(GCP)で「APIとサービス」→「認証情報」→「OAuth 2.0 クライアント ID」の流れで、クライアントIDとクライアントシークレットを作っていつも通り認証します。
すると・・・

おお、何だこれは
まあ、数分後にリフレッシュすればいいんだな
そんな調子でリフレッシュしてみますが・・・

あれっ、同じ画面だ
どこのNPCかな?
原因を調査する
結局、何分後に読み込み直しても、何時間後に読み込み直しても、依然として同じ画面が出続けます。
IDとシークレットを入れているscriptPropertiesのキーとかも問題ないし、OAuth2のライブラリがおかしいってことも無さそう。
(OAuth2のライブラリは、ライブラリID: 1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDFのやつですね。)
僕が認証機能を作ったのが1週間前で、僕がOAuth2のリポジトリを見た時の更新日時が2ヶ月前でした。なので、OAuth2は問題じゃない。
この「Google ドキュメント内でエラーが発生しました。このページを再読み込みするか、数分後にこのページをもう一度開いてみてください。」の文章で調べると、だいたいブラウザの閲覧履歴を消すという対策が出てきましたが、その方法でも解消しませんでした。 Googleから、色々とトラブルシューティングの候補が挙げられています。(でもこれも関係無さそう・・・期間内に新しい拡張機能入れてないんだよな)
他には、PDFに変換する領域内に環境依存文字があることで同じエラー画面が出てくるらしいのです。なので、スプシの内容かと思いましたが、それは関係ありませんでした。(後述しますが)
なぜか認証機能が動いた
そして、何をしたら動いたかと言うと・・・
ブックとシートを作り直して、そのGASに丸々同じものを書き写したら、動きました!!

この画面は、OAuthからのリダイレクト時に、こんなスクリプトで表示する手筈になっているものです。
/** * @description 認証コールバック * @return {null}*/function authCallback(request) { let service = getStorageService(false); let isAuthorized = service.handleCallback(request); let statement = ``; if (isAuthorized) { console.log("Authorized!"); console.log(`authCallback: 111111111111111111111111111111111111111111111`); statement = `<center>認証完了<br>タブを閉じてください。</center>`; } else { console.log("Not Authorized..."); console.log(`authCallback: 222222222222222222222222222222222222222222222`); statement = `認証エラー<br>認証情報をお確かめください。`; } return HtmlService.createHtmlOutput(statement);}
/** * @description 認証用サービス取得 * @param {boolean} isInputting * @return {}*/function getStorageService(isInputting) { const keyClientId = KEY_CLIENT_ID_SCRIPT_PROPERTY; const keyClientSecret = KEY_CLIENT_SECRET_SCRIPT_PROPERTY; let cfg = getClientConfig(isInputting, keyClientId, keyClientSecret); console.log(cfg); console.log(`getStorageService: 111111111111111111111111111111111111111111111`); if(cfg.clientId == null || cfg.clientSecret == null){ EXE_TYPE = "authentication"; const html = getHtmlOutput("index_html", "Authentication failed.") SpreadsheetApp.getUi().showModelessDialog(html, "Authentication failed.", "<p>Because of the shotage of OAuth2.0 Client Information.</p>"); return null; } console.log(`getStorageService: 22222222222222222222222222222222222222222222`); return OAuth2.createService("provisioning") .setAuthorizationBaseUrl("https://accounts.google.com/o/oauth2/auth") .setTokenUrl("https://accounts.google.com/o/oauth2/token") .setClientId(cfg.clientId) .setClientSecret(cfg.clientSecret) .setCallbackFunction("authCallback") .setPropertyStore(PropertiesService.getScriptProperties()) .setScope("https://www.googleapis.com/auth/devstorage.full_control") .setParam("login_hint", Session.getActiveUser().getEmail())}ふーむ、意味が分からない・・・
ちなみに、認証機能ではシートは全く参照しないというのと、シートの内容も作り直す前のシートと同じ内容にしました。 なので、スプシの内容は僕の場合は関係無さそうでした。
思い当たる節は・・・
そういえば、その1週間の間に、この認証機能があるブックの中にあるシートの内、AppSheetのデータベースとして連携させたものがあったなあ・・・ 新しいブックでは、まだAppSheetに連携させているデータベースはない・・・ じゃあ、AppSheetに連携させればまた動かなくなるのかも?(AppSheetっていうのは、ノーコードでアプリが作れるサービスのことです)
まあ、こんな感じで新しいブックをAppSheetのDBとして連携させます。

そして、認証させてみると・・・アレ?

認証通っちゃったなあ・・・ 結局、原因は分かりませんでした。
まとめ
今回のまとめです。
今回、チェックした事柄
今回チェックした事柄です。同じような事象が発生した時のチェック表としてご活用下さい。
- 5分以上待ってからもう一度読み込む
- シートの内容(環境依存文字が入ってたりしないか)
- scriptPropertiesのキー
- OAuth2ライブラリの挙動
- ブラウザ(今回はChrome)の閲覧履歴の全消去
- 別のブラウザを試す(普段使わないEdgeで試したりもしました)
- その他ここに載っていること
- AppSheetとの連携
今後、気を付けたいこと
自分の今後の心掛けたいこととして、
- GASの不具合でどうしても分からないときはブックを作り直す・・・1時間詰まったら作り直そう。
- Gitは怠けずにブランチを切る・・・個人用途で作っているものなので、ほとんどmainブランチにpushしてしまっていました。なので、ブックを作り直す時にすぐにコードを再現させるために、新機能を作るたびにブランチを切るようにします。
- スクリプトは定期的に動かすようにする・・・今回の事象が発生し始めた日時が分からず、原因が突き止めきれませんでした。なので、普段からコードを動かして原因のスコープを狭めて、即座にデバッグできるようにします。
- OAuthなどの認証機能があるブックは機能を肥大化させない・・・作り直しの時に大変になるので。
Google Apps Scriptの関連書籍
おしまい


以上になります!
記事を共有
この記事が役に立ったなら、ぜひ他の人と共有してください!