• #chrome-extension
  • #javascript
  • #troubleshooting
開発未分類完了

Chrome拡張機能のchrome.downloads APIでファイル名が無視される問題とプロファイル設定の関係

結論

chrome.downloads.download APIで filename パラメータを指定しても無視され、「ダウンロード」というファイル名になる問題は、Google Workspace管理プロファイルが原因である可能性が高い。

chrome://settings の上部に「お使いのプロフィールは ○○.com によって管理されています」と表示されるプロファイルでは、組織のセキュリティポリシーによって拡張機能の一部機能が制限されることがある。

回避策: 管理されていない個人プロファイルを使用する。

注意: これは相関関係に基づく仮説であり、根本原因は特定できていない。管理プロファイルと非管理プロファイルで挙動が異なることは確認したが、具体的にどのポリシーや設定が影響しているかは不明。

問題の状況

Chrome拡張機能で chrome.downloads.download APIを使用してCSVファイルをダウンロードする機能を実装した。

chrome.downloads.download({
    url: dataUrl,
    filename: 'MF_meisai/2026-01-22/test_file.csv',
    saveAs: false
}, (downloadId) => {
    // ...
});

期待する動作:

  • Downloads/MF_meisai/2026-01-22/test_file.csv に保存される

実際の動作:

  • Downloads/ダウンロード.csv として保存される
  • サブフォルダも作成されない

ファイル名が無視される

調査の経緯

1. コードの問題を疑う

最初はコードの問題だと考え、以下を試した:

  • Data URLの作成方法を変更(Base64エンコード → FileReader.readAsDataURL)
  • MIMEタイプの変更(text/csv → text/tab-separated-values)
  • BOMの有無を変更
  • フォルダ名から日本語を除去

結果: すべて効果なし。success: true が返るのにファイル名は「ダウンロード」のまま。

2. 別の拡張機能との比較

同じマシンで動作している別の拡張機能(Koyfin版)では、同じAPIでサブフォルダ作成・ファイル名指定が正常に動作していた。

C:\Users\numbe\Downloads\koyfin-data\2026-01-22\AAPL_20260122.tsv

コードを比較したが、ほぼ同一だった。

3. プロファイルの違いを発見

Koyfin版を使用する際は別のChromeプロファイルを使用していることに気づいた。

テスト:

  • 動くプロファイルでMF_明細全取得のテストボタンを押す
  • MF_test/2026-01-22/test_file.tsv が正常に作成された

同じコードでも、プロファイルによって挙動が異なることが判明。

4. プロファイル設定の比較

両方のプロファイルで chrome://settings/downloads を確認した。

動かないプロファイル:

動かないプロファイルの設定

動くプロファイル:

動くプロファイルの設定

「完了したらダウンロードを表示する」の設定が違ったが、これを変更しても問題は解決しなかった。

5. Google Workspace管理プロファイルの発見

動かないプロファイルの設定画面をよく見ると、「お使いのプロフィールは ○○.com によって管理されています」という表示があった。

これはGoogle Workspaceの組織によって管理されているプロファイルであることを示している。管理プロファイルでは、組織のセキュリティポリシーによって拡張機能の動作が制限されることがある。

参考: Chrome ブラウザが管理されているかどうか確認する - Google Chromeヘルプ

原因

Google Workspace管理プロファイルでは、chrome.downloads.download APIの filename パラメータが無視される。

chrome://policy の確認

chrome://policy で適用されているポリシーを確認した。

適用されていた主なポリシー:

  • ChromeDataRegionSetting
  • GenAiDefaultSettings
  • SafeBrowsingProtectionLevel
  • UserSecurityAuthenticatedReporting
  • UserSecuritySignalsReporting

注目すべき点: DownloadRestrictionsDownloadDirectory などのダウンロード関連ポリシーは明示的に設定されていない。にもかかわらず、chrome.downloads.download APIの filename パラメータが無視される。

これは、管理プロファイル自体に何らかの暗黙的な制限があるか、またはChrome側で管理プロファイルに対して適用されるデフォルトの制限が存在する可能性がある。

技術的背景

chrome.downloads.download API

Chrome拡張機能でファイルをダウンロードするためのAPI。

chrome.downloads.download({
    url: 'data:text/csv;base64,...',  // Data URL
    filename: 'subfolder/filename.csv', // サブフォルダ指定可能
    saveAs: false  // 保存ダイアログを表示しない
}, callback);

権限設定

manifest.jsondownloads 権限が必要:

{
    "permissions": ["downloads"]
}

Data URLの制限

Data URLを使用する場合、Chromeのバージョンやセキュリティ設定によって filename が無視されることがあるという報告がある。ただし、今回はプロファイル間で挙動が異なるため、この説明だけでは不十分。

代替手段

chrome.downloads.download が動作しない場合のフォールバック:

// Blob URL + anchor click方式
const blob = new Blob([content], { type: 'text/csv;charset=utf-8' });
const url = URL.createObjectURL(blob);

const a = document.createElement('a');
a.href = url;
a.download = filename;  // ファイル名は指定可能
document.body.appendChild(a);
a.click();

URL.revokeObjectURL(url);

この方式ではファイル名は正しく設定されるが、サブフォルダの指定はできない

まとめ

  • chrome.downloads.download APIの filename パラメータが無視される問題が発生
  • 同じコードでもChromeプロファイルによって挙動が異なる
  • 原因はGoogle Workspace管理プロファイルである可能性が高い
  • 管理プロファイルでは組織のセキュリティポリシーにより拡張機能の一部機能が制限される
  • 解決策は管理されていない個人プロファイルを使用すること
  • または、フォールバックとしてBlob URL + anchor click方式を使用(ただしサブフォルダ指定不可)

教訓

Chrome拡張機能の開発・テスト時は、使用しているプロファイルが管理プロファイルかどうかを確認すること。chrome://settings の上部に「○○によって管理されています」と表示されている場合、一部のAPIが制限される可能性がある。