からめもぶろぐ。

俺たちは雰囲気で OAuth をやっている

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

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

f:id:karamem0:20210818135245p:plain

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

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

qiita.com

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

前提

Power Automate の実行結果を見てみると、Office スクリプトを「ms-officescript://onedrive_business_itemlink/{{fileid}}」の形式で指定していることがわかります。この fileid は 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 にコピーして実行するようにします。

f:id:karamem0:20210818140110p:plain

フローを作成する

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

f:id:karamem0:20210818140329p:plain

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

f:id:karamem0:20210818140527p:plain

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

  • ドキュメント ライブラリ
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"
}

実行

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

f:id:karamem0:20210818142044p:plain

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

f:id:karamem0:20210818142154p:plain

まとめ

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