MENU

【Office Scripts×PAD】ExcelのセルからPADへ値を渡す方法|inputArguments×中継ページ

Excelのセルの値をPADのフロー入力として渡す仕組み解説|Office Scripts
目次

はじめに

前回では、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特有の制約に思わぬところでつまずきました。

前提: 前回の中継ページ(officescripts-11-pad-launch.html)と、実行URLの基本的な仕組みについては、前回の記事を先にご覧ください。

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という入力パラメーターをまだ追加していなかったことでした。

次の外部名を持つ入力変数が見つかりません:FileName、Mode」と表示されたPADのエラーダイアログ

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が正しく届いている証拠であるなど、エラーメッセージの読み解き方も紹介した

関連記事

当サイトの記事で使用したVBAなどのサンプルをDLできます

この記事のサンプルはありません!

ダウンロードページへは下のカードをクリックすればジャンプできます。
よろしければご利用ください!

よかったらシェアしてね!
  • URLをコピーしました!
目次