Power Automate + Office スクリプトを共有して実行できるようにする


はじめに

非常に強力な Power Automate と Office スクリプトの組み合わせですが、そのままではほかの人に共有して実行できないという欠点があります。普通に共有した場合、以下のようにエラーが出てしまいます。

スクリプトが見つかりません。共有が解除されたか、削除された可能性があります。

こちらの記事で解決策は提示されているものの、作成者のユーザーの接続を使って実行させるため、ちょっと気持ち悪いところがあります。

https://qiita.com/tetsuya-ooooo/items/1b225b9aa7dcb9f0bd1b

できれば実行者のコンテキストで実行させたいところです。そこでなんとかできないものかと頑張ってみました。

前提

Power Automate の実行結果を見てみると、Office スクリプトを ms-officescript://onedrive_business_itemlink/{{file-id}} の形式で指定していることがわかります。この file-id は Microsoft Graph の Drive API で取得できるファイルの ID です。この ID が作成者のユーザーの OneDrive for Business のファイルを見ているため実行できないということがわかります。この ID を実行時に変更してあげれば、自分の OneDrive for Business にある任意のスクリプトを実行できそうです。

実行方法

Office スクリプトを作成する

Excel on the web で Office スクリプトを作成します。value を受け取ってセルに書き込むだけの簡単なスクリプトです。

function main(workbook: ExcelScript.Workbook, value: string)
{
  const worksheet = workbook.getActiveWorksheet();
  worksheet.getCell(0, 0).setValue(value);
}

保存するとスクリプトは Documents/Office Scripts フォルダーに格納されます。

Office スクリプトを公開された場所に格納する

共有されたユーザーがアクセスできる場所であればどこでもいいのですが、今回は SharePoint のドキュメント ライブラリにアップロードします。ついでにスクリプトを実行する Excel ファイルのテンプレートもアップロードします。Power Automate を実行したときに、ここのファイルを自分の OneDrive for Business にコピーして実行するようにします。

フローを作成する

全体像はこうなりました。Excel ファイルは任意の場所に、Office スクリプト ファイルは Documents/Office Scripts フォルダーにコピーするようにします。

最後にこれらのファイルを指定してスクリプトを実行するようにします。

ファイルを作成したときに出力として ID が取得できます。これは{{drive-id}}.{{file-id}} の形式になっているのでピリオドで分割して設定してあげます。

  • ドキュメント ライブラリ
split(outputs('テンプレート_ファイルを作成します')?['body/Id'],'.')[0]
  • ファイル
split(outputs('テンプレート_ファイルを作成します')?['body/Id'],'.')[1]
  • スクリプト
concat('ms-officescript%3A%2F%2Fonedrive_business_itemlink%2F',split(outputs('スクリプト_ファイルを作成を作成します')?['body/Id'],'.')[1])

ScriptParameters には Office スクリプトに渡すパラメーターを JSON 形式で指定します。今回は value パラメーターを受け取るので以下のようにしています。

{
  "value": "OfficeScripts1"
}

実行結果

共有されたユーザーで実行するとフローが正常に終了しているのがわかります。

ちゃんと結果も書き込まれていますね。

おわりに

今回は手動で実行するフローでしたが Power Apps からの呼び出しでも同様のテクニックが使えるのではないかと思います。