今回の記事では、承認後にExcel申請書へはんこを押すPower Automateフローを実装していきます。
Power Automate単体では難しいため、Officeスクリプトを併用して実現していきます。
(Power AutomateフローからOfficeスクリプトを呼び出す形になります)
実現したいこと
申請者は、申請書(Excelファイル)をSharePointドキュメントライブラリに格納します。
自動で承認フローが開始されるため、承認者は承認/却下を選択します。
承認された場合は、申請書の特定のセルに承認印(はんこ)が押されます。
Excelファイルの用意
今回は以下のような申請書(Excelファイル)を用意しましたが、Excelであればどんなフォーマットでも結構です。
承認印を押したい位置を予め確認しておいてください。 (今回はD11セルになります)
Officeスクリプトの作成
はんこを押すためのOfficeスクリプトを作成していきます。
ドキュメントライブラリとExcelファイルの準備
まずは、Officeスクリプト保存用 兼 申請書アップロード用のSharePointドキュメントライブラリを用意します。
私は「Application」というドキュメントライブラリを新たに作成しましたが、既存のドキュメントライブラリでも問題ありません。
続いて、ドキュメントライブラリ内にExcelファイルを作成します。
名前は「EditStampScript」としました。
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スクリプトの場所を設定してください。
スクリプトまで入力が完了すると、追加で設定値の入力を求められます。
以下の設定例を参考に、ご自由に設定してください。
| 項目名 | 項目説明 | 設定例 |
|---|---|---|
| text1 | 1段目に入力されるテキスト | 承認済 |
| text2 | 2段目に入力されるテキスト | 本日の日付を表す式 convertFromUtc(utcNow(),’Tokyo Standard Time’,’yyyy.MM.dd’) |
| text3 | 3段目に入力されるテキスト | 承認者の姓 (動的なコンテンツ > 姓) |
| targetCell | 押印するセル位置 | D11 |
| size | はんこのサイズ | 60 |
| color | はんこの色コード (16進数) | #FF0000 |
| fontSize | テキストのフォントサイズ | 9 |
設定ができたらフロー作成は完了です。
問題なくフローが作成されていれば、以下のような全体像になります。
フローのテスト実行・調整
フローが完成したため、テスト・調整を実施することをお勧めします。
申請書(Excelファイル)をSharePointドキュメントライブラリに格納します。
自動で承認フローが開始されるため、承認者は承認/却下を選択します。
承認された場合は、申請書の特定のセルに承認印が押されることを確認してください。
承認印のレイアウトが崩れてしまった場合は、こちらを参考に位置や大きさ・フォントサイズを調整してください。
まとめ
今回の記事では、承認後にExcel申請書へはんこを押すPower Automateフローを実装しました。
必要に応じて、承認アクションやOfficeスクリプトをカスタマイズしてご利用ください。
(Officeスクリプトについては、生成AIを利用することで細かな微調整ができるかと思います)






























