現在、SharePoint 2007 ドキュメント ライブラリのリストを提供するスクリプトの作成に取り組んでおり、次の処理を実行します。
- Excel で、他のブックやシートにリンクしているセル内の数式を見つける (XLS/XLSX)
http://serverold/site/doclib/
見つかった場合は、式のリンクをに置き換えてhttp://servernew/sites/sitecollection/doclib
保存します- それ以外の場合は、ワークブックを閉じて、次のログの完全な URL と変更のファイル名に移動します。
このリンクのコードを 出発点として使用すると、次の作業を行うことができません。
- スクリプトに数式内の URL を検出させるための正規表現
- スクリプトを変更して、セル内の数式の古いパスを新しいパスに置き換えます。
- 一致が見つかった場合 (保存して閉じる) と見つからない場合 (単に閉じる) を処理する各ブランチの a
私が行ったすべての調査について詳しくは説明しません (情報は地上では非常に軽いです)。別のスレッドで、これらのリンクを Excel で一元的に列挙できると言及されていますが、例やリンクは示されておらず、 PowerShell (Excel 2010 がインストールされている) でリンク コレクションを列挙しようとすると、その意味で "リンク" として知っている、使用しているワークブックの例では空です。
リンク コレクションを列挙する例:
$File = "C:\temp\example.xls"
$Excel = New-Object -ComObject Excel.Application
$Excel.visible = $true
$Workbook = $Excel.workbooks.open($file)
$Workbook.LinkSources
そこで質問なのですが、どの方法が正しいのでしょうか?
Excel 数式の例
=+'http://server.old/site/site/Work in Progress `enter code here`Documents/Statements/[Hierarchy2011.xls]Reports'!$AD$37+'http://server.old/site/site/Work in Progress Documents/
リンクを列挙するスクリプト (出発点として言及したリンクから) -
$path = "C:\temp"
$excelSheets = Get-Childitem -Path $path -Include *.xls,*.xlsx -Recurse
$excel = New-Object -comobject Excel.Application
$excel.visible = $false
foreach($excelSheet in $excelSheets)
{
$workbook = $excel.Workbooks.Open($excelSheet)
"There are $($workbook.Sheets.count) sheets in $excelSheet"
For($i = 1 ; $i -le $workbook.Sheets.count ; $i++)
{
$worksheet = $workbook.sheets.item($i)
"`tLooking for links on $($worksheet.name) worksheet"
$rowMax = ($worksheet.usedRange.rows).count
$columnMax = ($worksheet.usedRange.columns).count
For($row = 1 ; $row -le $rowMax ; $row ++)
{
For($column = 1 ; $column -le $columnMax ; $column ++)
{
[string]$formula = $workSheet.cells.item($row,$column).formula
if($formula -match "\w?:\\\w*\\\[\w*\.xls\w?\]") {"`t`t$($formula)"}
} #end for $column
} #end for $row
$worksheet = $rowmax = $columnMax = $row = $column = $formula = $null
} #end for
$workbook.saved = $true
$workbook.close()
} #end foreach
$excel.quit()
$excel = $null
[gc]::collect()
[gc]::WaitForPendingFinalizers()
助けてくれる人、そして時間を割いてくれてありがとう。ベスト、アッシュ