はじめに
前回では、Web版Excelのセルに置いたリンクをクリックして、クラウド版Power Automateを使わずにWindows上のPAD(Power Automate Desktop)のフローを起動する方法を実機検証しました。中継ページ(静的HTML1枚)を経由させることで、Excel for the web自身がms-powerautomate:のような未知のURLスキームをブロックしてしまう問題を回避し、実際にPADを起動するところまで確認できています。
ただ、前回の方法では「決まったフローを起動するだけ」で、Excel側の状況に応じて処理内容を変えることはできません。今回は、この起動の仕組みに手を加え、Excelのセルの値(対象ファイル名やモードなど)をPADのフロー入力(inputArguments)として動的に渡す方法を解説します。ここでも、Excel for the web特有の制約に思わぬところでつまずきました。
Excel側でセルの値を反映する(inputArgumentsとの組み合わせ)
セルの値をPADのフロー入力として渡すには、実行URLのinputArgumentsパラメータを使います。Microsoft公式ドキュメントによると、inputArgumentsにはJSON形式で値を指定します。
ms-powerautomate:/console/flow/run?workflowId=[workflowId]&inputArguments={"NewInput": "Hello", "NewInput2": 123, "NewInput3": true}素直に考えると、Excel側でHYPERLINK関数とENCODEURL関数を組み合わせ、このJSON文字列ごとエンコードして中継ページへ渡せばよさそうに思えます。しかし、この方式は成立しません。
つまずいたポイント:ENCODEURLがExcel for the webで使えない
実際にENCODEURL関数を使った数式を組んだところ、#VALUE!エラーが繰り返し発生しました。セルの参照を外しても、ダブルクォートの数を数え直しても、リテラルな文字列だけの最小構成(=ENCODEURL("a""b"))に絞っても再現し、原因の切り分けに手間取りました。
最終的に判明した原因は、Microsoft公式ドキュメントに明記されている仕様上の制約でした。
ENCODEURL 関数は、Excel for the web または Excel for Mac では使用できません。
(ENCODEURL 関数 | Microsoft Support)
デスクトップ版Excelでは問題なく動く関数ですが、Web版では最初からサポート対象外でした。つまり、Excel for the web上でENCODEURLをその場で計算させる方式は、そもそも成立しない設計だったということです。
新方式:Excelは生の値を渡すだけ、組み立てとエンコードはJavaScript側で行う
そこで、JSON文字列の組み立てとURLエンコードの責務を、中継ページのJavaScript側に移す設計に変更しました。
- Excel側:セルの値を、
workflowidやarg_ラベル名=値という単純な形でURLに並べるだけ。JSONもエンコードも組み立てない - 中継ページ側:受け取った
arg_で始まるパラメータをすべて集めてJSONオブジェクトを組み立て(JSON.stringify)、encodeURIComponentで確実にエンコードしてからms-powerautomate:へリダイレクトする
Excel側で最低限気をつける必要があるのは、URLの構造そのものを壊す可能性がある記号(% & = # +)だけです。これらだけを手動で置換しておけば、日本語やスペースはブラウザが自動的に正しく処理してくれます。
=HYPERLINK(
"https://www.kurumico.com/officescripts-11-pad-launch.html?workflowid=f310acca-c97f-4dae-b4f3-015679868321"
& "&arg_FileName=" & SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A2,"%","%25"),"&","%26"),"=","%3D"),"#","%23"),"+","%2B")
& "&arg_Mode=" & SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(B2,"%","%25"),"&","%26"),"=","%3D"),"#","%23"),"+","%2B"),
"▶ PAD実行"
)arg_FileName・arg_Modeの部分が、そのままPADのinputArgumentsのキー名(FileName・Mode)に対応します。中継ページ(前回作成したofficescripts-11-pad-launch.html)に追加した、対応するJavaScriptは次の通りです。
var params = new URLSearchParams(window.location.search);
var workflowid = params.get('workflowid');
var args = {};
params.forEach(function (value, key) {
if (key.indexOf('arg_') === 0) {
args[key.slice(4)] = value;
}
});
var target = 'ms-powerautomate:/console/flow/run?workflowid=' + encodeURIComponent(workflowid) +
'&inputArguments=' + encodeURIComponent(JSON.stringify(args));
window.location.href = target;JSON.stringifyがキー・値のダブルクォートのエスケープを自動でやってくれるため、Excel側で""を重ねて書くような複雑な処理が一切不要になります。前回作成した中継ページは、このworkflowid+arg_方式と、完成済みのURLをそのまま渡す従来の?url=方式の両方に対応させてあります。
実機検証:inputArgumentsによる値渡し(成功)
上記の数式・中継ページの新方式を実機で試しました。
1回目:フロー側のエラー。 「次の外部名を持つ入力変数が見つかりません:FileName、Mode」というエラーが発生しました。一見失敗に見えますが、これはJSONが正しくPADへ届いていた証拠でもありました。PADがinputArgumentsの中身を読み取り、FileName・Modeというキー名を正しく認識したうえで「フロー側にその名前の入力パラメーターが定義されていない」とエラーを出していたためです。原因は、起動先のフローにFileName・Modeという入力パラメーターをまだ追加していなかったことでした。

2回目:同じエラーが再発。 フロー側に入力パラメーターを追加したはずが、まったく同じエラーが再現しました。確認したところ、数式内のworkflowidが、パラメーターを追加した方とは別のフローのIDになっていたことが原因でした(コピー元の古いIDを使い回してしまっていた)。
正しいworkflowidに修正したところ、成功しました。 PAD側の「メッセージを表示」アクションに%FileName% %Mode%が展開され、Excelのセル(A2・B2)の内容が正しくPADのフロー入力として渡っていることが確認できました。
これにより、ENCODEURLが使えないという制約を、中継ページのJavaScript側でJSON組み立て・エンコードを肩代わりする設計で回避できることが実証されました。
全体の仕組み(設計図)
Web版Excel
│
├─ Office Scripts(前処理)
│ └─ PADに渡す値(ファイル名・日付・モード等)をセルへ書き込む
│
└─ セルのハイパーリンク(arg_パラメータ付き、中継ページへ)
│ ユーザーがクリック
▼
中継ページ(静的HTML)
│ arg_パラメータを集めてJSON化 → encodeURIComponentでエンコード
▼
ms-powerautomate: 実行URL(inputArguments付き、ローカル完結)
│
▼
Windows上のPAD(デスクトップフロー)
│ %FileName% %Mode% などとして受け取る
▼
ローカルファイル操作・Windowsアプリ操作など
クラウド版Power Automateはどの段階にも登場しません。JSON組み立て・URLエンコードという、本来Excel側でやりたかった処理を中継ページのJavaScriptが肩代わりすることで、Excel for the webの関数制限を回避しています。
まとめ
inputArgumentsパラメータを使えば、Excelのセルの値をPADのフロー入力として動的に渡せるENCODEURL関数はExcel for the webでは使用できない(Microsoft公式ドキュメントに明記)。デスクトップ版で動く数式をそのままWeb版に持ち込むと#VALUE!エラーになる- 対応として、JSON組み立て・URLエンコードの処理を中継ページのJavaScript側(
JSON.stringify+encodeURIComponent)に移し、Excel側は危険な記号(%&=#+)だけをSUBSTITUTEで軽く置換して生の値を渡すだけにする設計に変更した - 実機検証で、Excelのセルの値が実際にPADのフロー入力として正しく渡ることを確認できた
- デバッグ中に出た「入力変数が見つかりません」というエラーは、一見失敗に見えても実はJSONが正しく届いている証拠であるなど、エラーメッセージの読み解き方も紹介した
関連記事
- 【Web版Excel】VBAをOffice Scriptsに移行する方法
- 【保存版】VBA→Office Scripts 書換チートシート
- 生成AIでVBAをOffice Scriptsに変換できるか?
- 【検証】生成AIはVBAをOffice Scriptsに変換できるか?
- 【Office Scripts×Power Automate】UserFormの代替で完了通知を自動化する
- 【Office Scripts】UserForm代替パターン:進捗表示はセルで、キャンセルは実行ボタンで実装する
- 【Office Scripts×PAD】Power Automate for Desktopのブラウザ操作でExcel on the webのスクリプトを起動する
- 【Office Scripts移行】別ブックデータ取得の下準備|マーカー検索でセル番地を記録する
- 【Office Scripts移行】別ブックを開いてデータを取得する本編|PAD×PythonでWorkbooks.Openの壁を越える
- 【Office Scripts移行】PADの「キーの送信」を安定化する|クリップボード貼り付け×名前ボックスジャンプ
- 【Office Scripts×PAD】クラウドPower AutomateなしでWeb版ExcelからPADのフローを実行する方法
当サイトの記事で使用したVBAなどのサンプルをDLできます
この記事のサンプルはありません!
ダウンロードページへは下のカードをクリックすればジャンプできます。
よろしければご利用ください!

