最近Excelの細かな操作について聞かれることが多いので、メモ。
Office スクリプト(Office Scripts)
Office スクリプトは、Excel Onlineでタスクを自動化できるTypeScriptベースのプログラミング機能。
ユーザーはコードを記録・編集して複雑なデータ処理を自動化でき、Power Automateと連携することでより広範なワークフローの自動化も実現可能。
今回はその中のシートへの操作をまとめ。
事前準備
今回はSharePoint上のExcelに対し、操作を実施していく。




Officeスクリプトは[自動化]→[新しいスクリプト]から編集が可能で、


Power Automateからは[スクリプトの実行]アクションで呼び出す。


シートの作成
シートの作成はWorkbookの「addWorksheet」関数を使う。


function main(workbook: ExcelScript.Workbook, sheetName: string) { // 同名のシートが既に存在するかチェック if (workbook.getWorksheet(sheetName)) { console.log(`${sheetName} という名前のシートは既に存在します`); return; } // 新しいシートを作成 const newSheet = workbook.addWorksheet(sheetName); // 作成したシートをアクティブにする newSheet.activate(); console.log(`${sheetName} という名前の新しいシートを作成しました`); }
Power Automateから実行すると、指定の名前のシートが作成される。




シートの名前変更
シートの名前の変更は、Worksheetの「setName」関数を使用する。


function main(workbook: ExcelScript.Workbook, currentSheetName: string, newSheetName: string) { // 対象のシートを取得 const worksheet = workbook.getWorksheet(currentSheetName); // 対象のシートが存在しない場合 if (!worksheet) { console.log(`${ currentSheetName } というシートが見つかりません`); return; } // 変更後の名前が既に存在する場合 if (workbook.getWorksheet(newSheetName)) { console.log(`${ newSheetName } という名前のシートは既に存在します`); return; } // シートの名前を変更 worksheet.setName(newSheetName); console.log(`シート名を ${ currentSheetName } から ${ newSheetName } に変更しました`); }
Power Automateから実行するとこんな感じ。




シートのコピー
シートのコピーはWorksheetのcopy関数を使用する。
※引数に?をつけると、任意の引数にすることも可能。

※引数に?をつけると、任意の引数にすることも可能。

function main(workbook: ExcelScript.Workbook, sourceSheetName: string, newSheetName?: string) { // 元のシートを取得 const sourceSheet = workbook.getWorksheet(sourceSheetName); // 元のシートが存在しない場合 if (!sourceSheet) { console.log(`${sourceSheetName} というシートが見つかりません`); return; } // シートをコピー(デフォルトでは末尾に配置) const copiedSheet = sourceSheet.copy(ExcelScript.WorksheetPositionType.end); // 新しいシート名を設定 if (newSheetName) { // 指定されたシート名が既に存在する場合(コピー後のシート名と異なる場合のみチェック) if (newSheetName !== copiedSheet.getName() && workbook.getWorksheet(newSheetName)) { console.log(`${newSheetName} という名前のシートは既に存在します`); return; } // 指定された名前に変更 copiedSheet.setName(newSheetName); } console.log(`${sourceSheetName} を複製して ${copiedSheet.getName()} を作成しました`); }
Power Automateから新しいシート名を指定せずに実行すると、Excelが付けてくれた名前で複製される。




シートの移動
シートを移動する際は、WorksheetのsetPosition関数を使用する。
先頭へ移動
先頭へ移動する際は、引数に0を指定。


function main(workbook: ExcelScript.Workbook, sheetName: string) { // 対象のシートを取得 const sheet = workbook.getWorksheet(sheetName); // シートが存在しない場合 if (!sheet) { console.log(`${sheetName} というシートが見つかりません`); return; } // シートを先頭に移動(位置0が先頭) sheet.setPosition(0); console.log(`${sheetName} を先頭に移動しました`); }
実行結果。




末尾へ移動
末尾に移動する際は、シートの数を取得し、その-1を指定する。
function main(workbook: ExcelScript.Workbook, sheetName: string) { // 対象のシートを取得 const sheet = workbook.getWorksheet(sheetName); // シートが存在しない場合 if (!sheet) { console.log(`${sheetName} というシートが見つかりません`); return; } // ワークブック内のシート数を取得 const worksheetCount = workbook.getWorksheets().length; // シートを末尾に移動(シート数-1が末尾の位置) sheet.setPosition(worksheetCount - 1); console.log(`${sheetName} を末尾に移動しました`); }
特定のシートの前へ移動
特定のシートの前に移動する際は、対象のシートのポジション(整数)を取得し、そのポジションを引数に指定する。


function main(workbook: ExcelScript.Workbook, targetSheetName: string, referenceSheetName: string) { // 移動させるシートを取得 const targetSheet = workbook.getWorksheet(targetSheetName); // 基準となるシートを取得 const referenceSheet = workbook.getWorksheet(referenceSheetName); // 対象のシートが存在しない場合 if (!targetSheet) { console.log(`${targetSheetName} というシートが見つかりません`); return; } // 基準シートが存在しない場合 if (!referenceSheet) { console.log(`${referenceSheetName} というシートが見つかりません`); return; } // 基準シートの位置を取得 const referencePosition = referenceSheet.getPosition(); // ターゲットシートを基準シートの前に移動 targetSheet.setPosition(referencePosition); console.log(`${targetSheetName} を ${referenceSheetName} の前に移動しました`); }
実行結果。




シートの削除
シートの削除はWorksheetのdelete関数を使用する。


function main(workbook: ExcelScript.Workbook, sheetName: string) { // 削除するシートを取得 const sheet = workbook.getWorksheet(sheetName); // シートが存在しない場合 if (!sheet) { console.log(`${sheetName} というシートが見つかりません`); return; } // シートを削除 sheet.delete(); console.log(`${sheetName} を削除しました`); }
実行結果。




おまけ:エラーを検知したい場合
Office Scriptはresultというオブジェクトに戻り値を詰めて、Power Automate側で操作失敗時の処理を書くことができる。
例えば以下のコードではboolの「success」とstringの「message(エラーメッセージ)」をPower Automateに返すことを宣言していて、
function main(workbook: ExcelScript.Workbook, sheetName: string): { success: boolean, message: string } { try { // シート名が空かどうかチェック if (!sheetName || sheetName.trim() === "") { return { success: false, message: "シート名が指定されていません" }; } // 同名のシートが既に存在するかチェック if (workbook.getWorksheet(sheetName)) { return { success: false, message: `${sheetName} という名前のシートは既に存在します` }; } // 新しいシートを作成 const newSheet = workbook.addWorksheet(sheetName); // 作成したシートをアクティブにする newSheet.activate(); // 成功の場合 return { success: true, message: `${sheetName} という名前の新しいシートを作成しました` }; } catch (error) { // 予期しないエラーが発生した場合 return { success: false, message: `エラーが発生しました: ${error.message || error}` }; } }
Power Automateの「条件」アクションなどで戻り値を参照し、エラー時の動作を構築することも可能。


コメント