Power AutomatePower Platform

【Power Automate】承認後に自動押印!Excel申請書へはんこを押すフローの作り方

今回の記事では、承認後にExcel申請書へはんこを押すPower Automateフローを実装していきます。
Power Automate単体では難しいため、Officeスクリプトを併用して実現していきます。
(Power AutomateフローからOfficeスクリプトを呼び出す形になります)

スポンサーリンク

実現したいこと

申請者は、申請書(Excelファイル)をSharePointドキュメントライブラリに格納します。

申請書
申請書のアップロード

自動で承認フローが開始されるため、承認者は承認/却下を選択します。

承認通知

承認された場合は、申請書の特定のセルに承認印(はんこ)が押されます。

はんこ
スポンサーリンク

Excelファイルの用意

今回は以下のような申請書(Excelファイル)を用意しましたが、Excelであればどんなフォーマットでも結構です。
承認印を押したい位置を予め確認しておいてください。 (今回はD11セルになります)

申請書
スポンサーリンク

Officeスクリプトの作成

はんこを押すためのOfficeスクリプトを作成していきます。

ドキュメントライブラリとExcelファイルの準備

まずは、Officeスクリプト保存用 兼 申請書アップロード用のSharePointドキュメントライブラリを用意します。
私は「Application」というドキュメントライブラリを新たに作成しましたが、既存のドキュメントライブラリでも問題ありません。

ドキュメントライブラリ作成
ドキュメントライブラリ作成_空のライブラリ
ドキュメントライブラリ作成_命名

続いて、ドキュメントライブラリ内にExcelファイルを作成します。
名前は「EditStampScript」としました。

Excelブックの作成
Excelブックの名前変更

Officeスクリプトの作成

「自動化」タブに移動し、「新しいスクリプト」>「コード エディターで作成」を選択します。
その後ポップアップが表示された場合は「スクリプトを書く」を選択します。

スクリプトの作成
スクリプトの作成_選択画面

続いて、以下のOfficeスクリプトをコピーします。 (右上の青いコピーボタンをご利用ください)
このコードでは、設定値を受け取って承認印を押す処理を実装しています。

/**
 * 指定したセルに押印するスクリプト
 * @param text1 1段目のテキスト
 * @param text2 2段目のテキスト
 * @param text3 3段目のテキスト
 * @param targetCell 押印するセル番地 (例:A1)
 * @param size はんこの直径
 * @param color はんこの色 (16進数色コード)
 * @param fontSize 文字サイズ
 */
function main(
  workbook: ExcelScript.Workbook,
  text1: string,
  text2: string,
  text3: string,
  targetCell: string,
  size: number = 50,
  color: string = "#FF0000",
  fontSize: number = 8
) {
  size = Number(size) || 50;
  fontSize = Math.round(Number(fontSize)) || 8;
  color = color || "#FF0000";
  const sheet = workbook.getActiveWorksheet();
  const cell = sheet.getRange(targetCell);
  // セル中央配置のための座標計算
  const cellLeft = cell.getLeft();
  const cellTop = cell.getTop();
  const cellWidth = cell.getWidth();
  const cellHeight = cell.getHeight();
  const startX = Math.max(0, cellLeft + (cellWidth / 2) - (size / 2));
  const startY = Math.max(0, cellTop + (cellHeight / 2) - (size / 2));
  // 仕切り線の位置決め
  const line1Pos = 0.33;
  const line2Pos = 0.67;
  const line1Y = startY + (size * line1Pos);
  const line2Y = startY + (size * line2Pos);
  // 外枠円の作成
  const circle = sheet.addGeometricShape(ExcelScript.GeometricShapeType.ellipse);
  circle.setLeft(startX);
  circle.setTop(startY);
  circle.setWidth(size);
  circle.setHeight(size);
  circle.getLineFormat().setColor(color);
  circle.getLineFormat().setWeight(2);
  circle.getFill().clear();
  // 仕切り線の作成
  const lineStartX = startX + (size * 0.05);
  const lineEndX = startX + (size * 0.95);
  const line1 = sheet.addLine(lineStartX, line1Y, lineEndX, line1Y);
  line1.getLineFormat().setColor(color);
  line1.getLineFormat().setWeight(1);
  const line2 = sheet.addLine(lineStartX, line2Y, lineEndX, line2Y);
  line2.getLineFormat().setColor(color);
  line2.getLineFormat().setWeight(1);
  // テキストボックスの作成
  const createTB = (txt: string, yPos: number, h: number, fSize: number) => {
    const tb = sheet.addTextBox(txt);
    tb.setLeft(startX);
    tb.setTop(yPos);
    tb.setWidth(size);
    tb.setHeight(h);
    tb.getFill().clear();
    tb.getLineFormat().setVisible(false);
    const textFrame = tb.getTextFrame();
    const textRange = textFrame.getTextRange();
    const font = textRange.getFont();
    font.setColor(color);
    font.setSize(fSize);
    font.setBold(true);
    textFrame.setHorizontalAlignment(ExcelScript.ShapeTextHorizontalAlignment.center);
    textFrame.setVerticalAlignment(ExcelScript.ShapeTextVerticalAlignment.middle);
    textFrame.setLeftMargin(0);
    textFrame.setRightMargin(0);
    textFrame.setTopMargin(0);
    textFrame.setBottomMargin(0);
    return tb;
  };
  const tbTop = createTB(text1, startY, size * line1Pos, fontSize);
  const tbMid = createTB(text2, line1Y, size * (line2Pos - line1Pos), fontSize);
  const tbBot = createTB(text3, line2Y, size * (1 - line2Pos), fontSize);

  // グループ化
  const ids = [
    circle.getId(),
    line1.getId(),
    line2.getId(),
    tbTop.getId(),
    tbMid.getId(),
    tbBot.getId()
  ];
  sheet.addGroup(ids);
}

コードがコピーできたら、それをコード入力欄に貼り付けます。
コード入力欄にサンプルが入っている場合は、すべて削除してから貼り付けてください。

スクリプトの貼り付け

Officeスクリプト名を変更しておきます。
「名前の変更」アイコンを押し、「StampScript」と変更します。

スクリプトの名前変更

Officeスクリプトの移動

最後に、Officeスクリプトを作成したSharePointドキュメントライブラリに移動します。
(デフォルトでOneDriveに保存されてしまうので、フローで利用できるようSharePointに移動します)

スクリプトの移動
スクリプトの移動_保存

「スクリプトが正常に移動されました。」という通知が表示されたら完了です。

正常保存通知
スポンサーリンク

Power Automateフローの作成

Officeスクリプトの作成が完了したため、それを呼び出すPower Automateフロー (承認フロー) を作成していきます。

フローの新規作成

まずはPower Automateポータルにアクセスし、「作成」メニューに移動します。
トリガーの種類は「自動化したクラウドフロー」を選択します。

フローの作成

ポップアップが表示されるため、フロー名とトリガーの種類を選択します。
フロー名は任意の名前で問題ありませんが、今回は「Approval Stamp Flow」としました。
トリガーはSharePointコネクタの「ファイルが作成されたとき (プロパティのみ)」を選択します。

フローの作成_フロー名とトリガー

フローの設定

まずはトリガーを設定します。
「サイトのアドレス」と「ライブラリ名」に、最初に作成したドキュメントライブラリのアドレスと名前を入力します。

トリガーの設定

続いて、「開始して承認を待機」アクションを追加します。

開始して承認を待機

承認アクションの設定をしていきます。
承認の種類については、必ず「承認/拒否 – 最初に応答」を選択するようにしてください。
その他の設定値についてはご自由に入力いただいて結構ですが、迷った場合はこちらの記事を参考にしてください。

開始して承認を待機_設定

承認の結果によって分岐させるため、「条件」アクションを追加します。
条件式の左辺には、動的なコンテンツから「結果」を、右辺には「Approve」を入力します。

条件アクション
条件アクション_設定

True側(=承認された場合)の処理の中に、「ユーザー プロフィールの取得 (V2)」アクションを追加して承認者の情報を取得します。

プロフィールの取得

ユーザー (UPN) の設定値には、動的なコンテンツから「回答数 承認者のユーザー プリンシパル名」を設定してください。
(自動でFor eachが配置されますが気にせず、For eachはそのまま残しておいてください)

プロフィールの取得_設定

最後に、先ほど作成したOfficeスクリプトをPower Automateから呼び出します。

「ユーザー プロフィールの取得 (V2)」アクションの直後に、「SharePoint ライブラリからスクリプトを実行する」アクションを追加します。(For eachの中に配置されたことを確認してください)

スクリプトの実行

設定値を入力していきます。
ブックの場所・ブック ライブラリには最初に作成したSharePointドキュメントライブラリの場所を設定し、ブックには動的なコンテンツから「識別子」を入力してください。
スクリプトについては、先ほど作成したOfficeスクリプトの場所を設定してください。

スクリプトの実行_設定1

スクリプトまで入力が完了すると、追加で設定値の入力を求められます。
以下の設定例を参考に、ご自由に設定してください。

スクリプトの実行_設定2
項目名項目説明設定例
text11段目に入力されるテキスト承認済
text22段目に入力されるテキスト本日の日付を表す式 convertFromUtc(utcNow(),’Tokyo Standard Time’,’yyyy.MM.dd’)
text33段目に入力されるテキスト承認者の姓
(動的なコンテンツ > 姓)
targetCell押印するセル位置D11
sizeはんこのサイズ60
colorはんこの色コード (16進数)#FF0000
fontSizeテキストのフォントサイズ9

設定ができたらフロー作成は完了です。
問題なくフローが作成されていれば、以下のような全体像になります。

フロー全体像

フローのテスト実行・調整

フローが完成したため、テスト・調整を実施することをお勧めします。

申請書(Excelファイル)をSharePointドキュメントライブラリに格納します。

申請書
申請書のアップロード

自動で承認フローが開始されるため、承認者は承認/却下を選択します。

承認通知

承認された場合は、申請書の特定のセルに承認印が押されることを確認してください。

はんこ

承認印のレイアウトが崩れてしまった場合は、こちらを参考に位置や大きさ・フォントサイズを調整してください。

スポンサーリンク

まとめ

今回の記事では、承認後にExcel申請書へはんこを押すPower Automateフローを実装しました。
必要に応じて、承認アクションやOfficeスクリプトをカスタマイズしてご利用ください。
(Officeスクリプトについては、生成AIを利用することで細かな微調整ができるかと思います)

この記事は役に立ちましたか?

役に立った!
役に立たなかった...
フィードバックありがとうございました
スポンサーリンク
Hiromaru

普段からPower Platform・SharePointの技術を広めています!
デザインに力を入れて、見やすい・分かりやすい記事を投稿していきます

Hiromaruをフォローする
シェアする
Hiromaruをフォローする
タイトルとURLをコピーしました