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

AppSheet

はじまり

リサちゃん
リサちゃん

なんか認証できなくなったぁぁ・・・

135ml
135ml

うわあ、何だろこれマジで・・・

リサちゃん
リサちゃん

1週間前からコード変えてないよ!?

135ml
135ml

わけわかんねえな・・・

何が起こっているのか

今回は、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から、色々とトラブルシューティングの候補が挙げられています。(でもこれも関係無さそう・・・期間内に新しい拡張機能入れてないんだよな)

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との連携

今後、気を付けたいこと

自分の今後の心掛けたいこととして、

  1. GASの不具合でどうしても分からないときはブックを作り直す・・・1時間詰まったら作り直そう。
  2. Gitは怠けずにブランチを切る・・・個人用途で作っているものなので、ほとんどmainブランチにpushしてしまっていました。なので、ブックを作り直す時にすぐにコードを再現させるために、新機能を作るたびにブランチを切るようにします。
  3. スクリプトは定期的に動かすようにする・・・今回の事象が発生し始めた日時が分からず、原因が突き止めきれませんでした。なので、普段からコードを動かして原因のスコープを狭めて、即座にデバッグできるようにします。
  4. OAuthなどの認証機能があるブックは機能を肥大化させない・・・作り直しの時に大変になるので。

おしまい

リサちゃん
リサちゃん

腑に落ちない!

135ml
135ml

とりあえず動いて良かったがな・・・

以上になります!

コメント

タイトルとURLをコピーしました