🔄

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 から呼び出す場合も同様のテクニックが利用できると考えられます。

Discussion