Power Automate Excelのシートの操作まとめ|追加、削除、リネーム、複製(コピー)、移動

最近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の「条件」アクションなどで戻り値を参照し、エラー時の動作を構築することも可能。

関連記事

コメント

タイトルとURLをコピーしました