ゴールのイメージをそろえる
今回のテーマは「読み取り専用になっているファイル(ロック中・共有フォルダ・OneDrive など)を、Power Query で安定して読み込む“実務テンプレ”を理解すること」です。
結論から言うと、Power Query は「読むだけのツール」なので、基本的には“読み取り専用”でも問題なく扱えます。
ただし、ファイルの置き場所やロック状態によって、エラーになりやすいパターンがあるので、そこを整理しておきます。
読み取り専用ファイルと Power Query の関係
「属性としての読み取り専用」はほぼ問題にならない
Windows のファイルプロパティで「読み取り専用」にチェックが付いているだけなら、Power Query は普通に読み込めます。
Power Query はファイルを「書き換えない」ので、書き込み権限がなくても、読み取り権限さえあれば動きます。
たとえば、次のようなコードは、ファイルが読み取り専用でもそのまま動きます。
let
Source =
Excel.Workbook(
File.Contents("C:\Data\売上_2024-10.xlsx"),
true,
true
)
in
Source
Power Queryここで重要なのは、「OS や共有フォルダ側で“読み取り専用”になっていても、Power Query は『読むだけ』なので基本的に気にしなくてよい」という感覚です。
むしろ問題になるのは、「ロックされていてそもそも開けない」「権限がなくて読めない」ケースです。
「誰かが開いていてロック中」の Excel を読むとき
共有フォルダ上の Excel を、誰かが編集モードで開いているとき、
別の人が開こうとすると「読み取り専用で開きますか?」と聞かれますよね。
Power Query は、内部的には「読み取り専用で開く側」に近い動きをします。
多くのケースでは、誰かが開いていても Excel.Workbook(File.Contents(...)) で普通に読めます。
ただし、ネットワーク環境やロックの種類によっては、「ファイルが使用中です」系のエラーになることがあります。
その場合は、後で説明する「try で包んでスキップする」パターンが効いてきます。
例題1:共有フォルダ上の読み取り専用 Excel を安定して読む
想定する状況
共有フォルダ \\Server\Share\Sales に、毎月の売上ブックが置かれているとします。
ファイルは「編集する人」と「見るだけの人」がいて、あなたは Power Query で集計用ブックを作りたい。
ファイルは基本的に「読み取り専用で開く」運用になっているが、Power Query からは安定して読みたい、という状況です。
シンプルな実務テンプレ(単一ファイル)
let
FilePath = "\\Server\Share\Sales\売上_2024-10.xlsx",
Source =
Excel.Workbook(
File.Contents(FilePath),
true,
true
),
FirstSheetRow =
Table.SelectRows(Source, each [Kind] = "Sheet"){0},
FirstSheetTable = FirstSheetRow[Data],
Promoted =
Table.PromoteHeaders(
FirstSheetTable,
[PromoteAllScalars = true]
)
in
Promoted
Power Queryここでのポイントは、「読み取り専用だからといって、特別なオプションは不要」ということです。File.Contents は「ファイルを読み込むだけ」であり、書き込みは一切しません。
もし、たまに「ファイルが使用中です」系のエラーが出る環境なら、
この Excel.Workbook 部分を try で包んで「読めないときはスキップする」ようにできます。
例題2:フォルダ内の Excel を一括取込+読み取り専用・ロック中ファイルをスキップ
想定する状況
共有フォルダ \\Server\Share\Sales に、複数店舗の売上ブックが置かれているとします。
誰かが開いているファイルも混ざることがあり、そのときにクエリ全体が止まるのは避けたい。
「読めるファイルだけ集計し、読めなかったファイルは自動スキップしたい」という状況です。
実務テンプレ M コード(try で読み取り専用・ロック中を吸収)
let
// 1) フォルダ内のファイル一覧を取得
Source = Folder.Files("\\Server\Share\Sales"),
OnlyXlsx =
Table.SelectRows(
Source,
each Text.Lower([Extension]) = ".xlsx"
),
// 2) 各ブックの 1 枚目シートを「try 付き」で読み込む
WithTry =
Table.AddColumn(
OnlyXlsx,
"SheetTry",
each
try
let
wb =
Excel.Workbook(
[Content],
true,
true
),
firstSheetRow =
Table.SelectRows(wb, each [Kind] = "Sheet"){0},
firstSheetTable = firstSheetRow[Data],
promoted =
Table.PromoteHeaders(
firstSheetTable,
[PromoteAllScalars = true]
)
in
promoted,
type any
),
// 3) 正常に読めたブックだけに絞り込む
SuccessOnly =
Table.SelectRows(
WithTry,
each [SheetTry][HasError] = false
),
// 4) 成功した Value(テーブル)を取り出す
WithTable =
Table.AddColumn(
SuccessOnly,
"SheetTable",
each [SheetTry][Value],
type table
),
// 5) 代表テーブルから列名を取得
SampleTable = WithTable[SheetTable]{0},
ColNames = Table.ColumnNames(SampleTable),
// 6) SheetTable を展開して、全ブック分を縦に結合
Combined =
Table.ExpandTableColumn(
WithTable,
"SheetTable",
ColNames,
ColNames
)
in
Combined
Power Queryここでの重要ポイントは、「読み取り専用かどうか」ではなく「読めるかどうか」を try で判定していることです。
誰かがロックしていて Excel.Workbook がエラーになったファイルは、HasError = true になり、この時点で自動的にスキップされます。
つまり、「読み取り専用ファイル対応」というより、「読めない状態のファイルを巻き込んでクエリ全体を落とさない」ための型、として覚えておくと実務で使いやすいです。
OneDrive / SharePoint / Teams 上の読み取り専用ファイル
Web 上の Excel も「読むだけなら」基本は同じ
OneDrive や SharePoint、Teams のドキュメントライブラリにある Excel も、Power Query から読み込めます。
この場合は、File.Contents ではなく、接続ウィザードや SharePoint.Files などを使うことが多いですが、
本質的には「読み取り専用でも、読み取り権限さえあれば読める」という点は同じです。
たとえば、SharePoint のライブラリからファイル一覧を取る場合は、こんなイメージです。
let
Source =
SharePoint.Files(
"https://xxx.sharepoint.com/sites/YourSite",
[ApiVersion = 15]
),
Filtered =
Table.SelectRows(
Source,
each Text.EndsWith([Name], ".xlsx")
)
in
Filtered
Power Queryここから先は、Content を Excel.Workbook に渡す流れはローカルと同じです。
「読み取り専用」設定になっていても、あなたのアカウントに閲覧権限があれば、Power Query は普通に読み込めます。
もし権限が足りない場合は、「資格情報エラー」になりますが、これは Power Query の問題ではなく SharePoint 側の権限設定の話です。
この場合は、管理者に「閲覧権限(少なくとも読み取り)」を付けてもらう必要があります。
重要ポイントの深掘り
読み取り専用と「権限なし」は別物
ここを混同すると、原因が分からなくなりがちです。
読み取り専用
ファイルに書き込みはできないが、読むことはできる状態。Power Query 的にはほぼ問題なし。
権限なし(アクセス拒否)
そもそもファイルを開けない状態。Power Query からもエラーになる。
前者は「普通に読める」、後者は「そもそも接続できない」です。
後者の場合は、M コードをいじるのではなく、ネットワークや SharePoint の権限設定を見直す必要があります。
「読み取り専用で開かれている Excel」をどう扱うか
共有フォルダ上の Excel を誰かが開いているとき、
環境によっては Power Query からの Excel.Workbook がエラーになることがあります。
このときに効くのが、さっきの try パターンです。
読めるときは普通にテーブルとして返す。
読めないときは HasError = true になり、そのファイルだけスキップする。
これをフォルダ一括取込のテンプレに組み込んでおけば、
「誰かが開いているせいで、全体の更新が止まる」という事故をかなり減らせます。
実務テンプレとしてのまとめ
「読み取り専用ファイル対応」を Power Query 的に言い換えると、こうなります。
読み取り専用属性そのものは、基本的に気にしなくてよい(読むだけなので)。
問題になるのは「読めない状態(ロック・権限不足・破損)」なので、そこは try で包んでスキップできるようにしておく。
この二つを押さえておけば、共有フォルダでも OneDrive / SharePoint でも、
「読み取り専用だから怖い」という感覚はかなり薄れていくはずです。
