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




シートの作成

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} という名前の新しいシートを作成しました`);
}


シートの名前変更

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 } に変更しました`);
}


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

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()} を作成しました`);
}


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

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} の前に移動しました`);
}


シートの削除

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}`
};
}
}





コメント