2
1

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ノウハウ】企業向けExcel転記で陥りがちな認証エラーと最も確実な回避策

スクリーンショット 2025-11-01 202720.png

Google Apps Script (GAS) を利用した業務自動化は非常に強力ですが、企業アカウントが所有するGoogle Drive内のExcelファイル(.xlsx)を扱う際に、予期せぬ 「認証エラーの壁」 に直面することが多々あります。

GASの内部サービスを使ってもエラーを吐き続けることの問題を、私たちは最終的に 「ドライブサービスを迂回し、Web APIのダウンロード機能を利用する」 という手法で克服しました。

本記事では、この課題の根本原因と、今後のプロジェクトで確実にデータ転記を成功させるための 「最も安定した解決策」 を詳しく解説します。

1. 企業環境で認証エラーが発生する根本原因

GASが.xlsxファイルを開こうとするとき、Drive上では自動的にファイルを一時的なGoogleスプレッドシート形式に「変換」しようとします。企業環境では、この「変換」または「アクセス」のフェーズで、以下のような予期せぬ権限エラーが発生します。

🔺 よくある失敗の症状

失敗した手法 エラーメッセージの例 発生する原因
SpreadsheetApp.open(file) Exception: Service Spreadsheets failed... スクリプト実行ユーザーがファイルのオーナーでない、またはファイル形式の内部変換に失敗している。
Drive.Files.copy() GoogleJsonResponseException: File not found: [ファイルID] スクリプトがファイルIDを認識していても、Drive API経由でコピー(変換)を試みた際、組織の共有設定が厳格すぎて、コピー権限の壁を越えられない。
UrlFetchApp.fetch() (通常版) レスポンスがCSVではなく「ファイルを開けません」という内容のHTML ファイルが完全に公開されていない場合、認証トークンを付与しても、Webダウンロードのセキュリティチェックで弾かれてしまう。

これらのエラーが発生し始めたら、通常のGASサービス(SpreadsheetAppやDriveApp)でファイルを直接操作するのを諦め、認証の経路を変更する必要があります。

2. 最終的に成功した「認証回避」の技術:Webダウンロードエンドポイントの利用

この問題の最終的な解決策は、「ファイルの所有権や権限階層に依存しない、強力な認証トークン付きのダウンロードパス」 を利用することです。

私たちは、以下の3つの要素を組み合わせたパイプラインを採用しました。

成功パイプラインの構成要素と技術的背景

項目 説明 なぜ安定するのか
認証 ScriptApp.getOAuthToken() GAS実行ユーザーの最も強力なアクセストークンを取得する。
アクセス手法 Web API ダウンロードエンドポイント Driveの内部サービスではなく、ユーザーがブラウザでダウンロードするのと同じWebアクセス経路を使用。
データ形式 ExcelファイルをCSV形式(export?format=csv)でダウンロード。 .xlsxファイルをそのまま扱わず、データのみを強制的にテキスト化。GASが嫌うファイル形式の内部変換処理を回避する。
GAS関数 UrlFetchApp.fetchとUtilities.parseCsv データのダウンロードと解析をシンプルに分けることで、エラー発生箇所の特定が容易になる。

成功したコードの核となるロジック

// 1. ダウンロードURLの構築
// file.getId()で対象ファイルを指定し、format=csvでCSV形式でのエクスポートを強制
const xlsxDownloadUrl = 
  `https://docs.google.com/spreadsheets/d/${file.getId()}/export?format=csv`;

// 2. UrlFetchAppで認証トークンをヘッダーに付与し、ダウンロードを試行
const responseText = UrlFetchApp.fetch(xlsxDownloadUrl, {
  // 取得したトークンをAuthorizationヘッダーに付与し、認証を強制
  headers: {
    'Authorization': 'Bearer ' + ScriptApp.getOAuthToken(),
  },
  // エラーページが返されてもスクリプトを中断しない設定
  muteHttpExceptions: true
}).getContentText();

// 3. 取得したCSV文字列を配列データに変換
const rawData = Utilities.parseCsv(responseText);

3. 実践的なエラーハンドリング

この手法を使っても、ファイルが完全に削除されたり、アクセス権が完全に失われたりした場合は、CSVではなくHTMLのエラーページがresponseTextに含まれてしまいます。

これをデータとして処理しないために、必ず以下のチェックを加えてください。

🔷 HTMLエラーのチェック(必須)

if (responseText.startsWith("<!DOCTYPE html>")) {
  // 権限やファイルパスの問題が依然として存在するため、処理を中断
  Logger.log("エラー:ダウンロード中にHTMLエラーページが返されました。");
  throw new Error("CSVダウンロード中にHTMLエラーページが返されました。権限設定を確認してください。");
}

これらの回避策とエラーハンドリングを適用することで、企業環境での複雑なデータ転記作業の安定性を確保できます。この手法をテンプレートとして採用し、今後の開発にお役立てください。

2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?