⬆️

Power Automateでkintoneの添付ファイルにアップロードする方法

に公開
免責事項

本記事の内容は情報提供を目的としており、正確性や完全性を保証するものではありません。記事を参考にした開発や運用は、すべてご自身の責任で行ってください。本記事の利用により生じた損害について、著者は一切の責任を負いません。
また、本記事に記載された情報が最新であることを保証するものではありません。

はじめに

この記事では、Microsoft Power Automateのクラウドフロー(以下「Power Automate」)を使って、ファイルをkintoneの添付ファイルフィールドにアップロードする方法を解説します。
本記事では、特に、日本語ファイル名を文字化けさせずにアップロードするためのPower Automateの設定方法に焦点を当てています。

https://jp.cybozu.help/k/ja/user/oauth/msflow.html
https://cybozu.dev/ja/kintone/tips/development/3rd-party-services/microsoft/essentials-for-kintone-connector/

参考記事

本記事の作成にあたり、Zennで公開されている「Power Automateでkintoneに添付ファイルをアップロードしてみた」が大変参考になりました。この場を借りて感謝を申し上げます。
https://zenn.dev/kai0707/articles/dff233e5a0d91c

本記事は、「日本語ファイル名の文字化け問題」に焦点を当てて、追加で調査・実装した内容を補足するものになります。

手順

事前準備

その上で、次の準備を行います:

  1. kintoneアプリの作成
    • [添付ファイル]フィールドを追加し設定します。
    • アプリIDを確認します。
      • アプリIDは、Power Automateでkintoneコネクタを使用する際に必要です。
  2. APIトークンの発行
    • kintoneアプリの[設定画面]から[カスタマイズ/サービス連携]→[APIトークン]を選択しトークンを発行します。
    • トークンには[レコード閲覧]と[レコード編集]の権限が必要です。

Power Automateの設定

主なステップ

  1. (アップロードしたいファイルの[ファイルコンテンツの取得]を行う)
    • 本記事では、Sharepointのドキュメントライブラリ内のファイルをkintoneの添付ファイルフィールドに移すフローを作成しました
  2. ファイルをkintoneの一時保管領域にアップロードしてfileKeyを取得する
  3. アップロードしたファイルのfileKeyとレコードを関連付ける

https://cybozu.dev/ja/kintone/docs/rest-api/files/upload-file/

1. ファイルをkintoneの一時保管領域にアップロードしてfileKeyを取得する

以下の画像を参考に設定して下さい。

kintoneの一時保管領域に添付ファイルをアップロード

Body"Content-Disposition"の、filename*の設定が重要です。

ここでfilenameに日本語ファイル名をだけ与えてしまうと文字化けした状態でkintone上にアップロードされてしまいました。filenameは省略せずにfilename*と一緒にセットしてあげると、文字化けなしでうまく行きました。

filename*には、utf-8''に続いてURLエンコードした日本語ファイル名をセットしてください。Power Automateでは、uriComponent()関数でURLエンコードできます。

URI

https://(サブドメイン名).cybozu.com/k/v1/file.json

Method

  • POST

Headers

{
    "X-Cybozu-API-Token": "API_TOKEN"
}
  • 上記の画像のapiTokenは、[変数を初期化する]アクションに設定した変数を呼び出しています。

Body

{
  "$content-type": "multipart/form-data",
  "$multipart": [
    {
      "body": @{body('パスによるファイル_コンテンツの取得')},
      "headers": {
        "Content-Disposition": "form-data; name=file;filename=@{triggerBody()?['{FilenameWithExtension}']};filename*=utf-8''@{uriComponent(triggerBody()?['{FilenameWithExtension}'])}"
      }
    }
  ]
}
  • 上記の画像の本文は、[パスによるファイルコンテンツの取得]アクションの返り値の配列から呼び出しています。
  • 上記の画像の拡張子付きのファイル名は、(見切れてて見えませんが)[ファイルが作成されたとき(プロパティのみ)]トリガーの返り値の配列から呼び出しています。

参考:
https://qiita.com/khsk/items/d541b8dc40bd2c6128d2

補足;kintoneの公式ページで言及されているRFC7578の記載とは競合する内容かもしれません。
https://tex2e.github.io/rfc-translater/html/rfc7578.html

2. アップロードしたファイルのfileKeyとレコードを関連付ける

以下の画像を参考に設定して下さい。
kintoneのレコードを更新

URI

https://(サブドメイン名).cybozu.com/k/v1/record.json

Method

  • PUT

Headers

{
    "X-Cybozu-API-Token": "API_TOKEN",
    "Content-Type": "application/json"
}
  • 上記の画像のapiTokenは、[変数を初期化する]アクションに設定した変数を呼び出しています。

Body

{
  "app": @{variables('アプリID')},
  "id": @{variables('kintoneのレコード番号')},
  "record": {
    "file1": {
      "value": [
        {
          "fileKey": @{variables('fileKey')}
        }
      ]
    }
  }
}
  • 上記の画像のfile1は、kintoneアプリの添付ファイルフィールドで使用している「フィールドコード」なのでご自身の環境に合わせて変更して下さい。

https://cybozu.dev/ja/kintone/docs/rest-api/records/update-record/#notes

上書きせずに追加したい場合は、下記の「1件のレコードを取得する」をHTTPコネクタで実行して、目的の「フィールドコード」に格納されいるfileKeyの配列を取得して、上記のfileKeyの配列と結合してから添付ファイルフィールドを更新すると良いかと思います。本記事では詳細は割愛します。

https://cybozu.dev/ja/kintone/docs/rest-api/records/get-record/

最後に

本記事で紹介した例では、(やや動作が不安定/遅い気がしますが)SharePointドキュメントライブラリに追加したファイルを、kintoneの添付ファイルフィールドに転送することができました。

この記事が参考になれば幸いです!🙇‍♂️

Discussion