# はじめに

Anyflow Embedの概要について説明します

### <button type="button" class="button primary" data-action="ask" data-icon="gitbook-assistant">Ask a question...</button>

### Anyflow Embed とは

Anyflow Embed は、SaaSベンダー向けの**組み込み型iPaaS（Embedded iPaaS）**&#x3067;す。

SaaSプロダクトに外部連携の機能を組み込むのに特化して作られており、一般的なiPaaSと異なる特徴をもっています。

<figure><img src="/files/eT4snVDYbyeKAtfZdr9W" alt="" width="563"><figcaption></figcaption></figure>

#### 一般的なiPaaS

* エンドユーザーが自身で連携を構築
* エンドユーザーの社内だけで使うことを想定
* 連携の中で使う変数やパラメータは基本的に固定化されている

#### Anyflow Embed（組み込み型iPaaS）

* エンドユーザーは連携を構築しない
* 連携を構築するのはSaaSベンダー
* SaaSプロダクトの機能として、複数社のエンドユーザーに対し連携を提供
* 連携の中で使う変数やパラメータはエンドユーザーごとに異なる

### デモイメージ

* [エンドユーザーが連携を使用するデモ](https://product.plainer.co.jp/c/anyflow-embed/adf446c1-e6b7-4332-afe5-28dea46a2a61)
* [SaaSベンダーが連携を構築するデモ](https://product.plainer.co.jp/c/anyflow-embed/68e622cb-c041-4839-a4d4-8bf0147ef86b)

### 主な連携スキーム

<figure><img src="/files/O4tZplrslK0DUKEtNFgp" alt=""><figcaption></figcaption></figure>

<table><thead><tr><th width="198.47265625">スキーム</th><th>具体例</th></tr></thead><tbody><tr><td>自社プロダクト起点<br>外部SaaSに送信</td><td>自社プロダクトで新たなデータが作成されたらSlackに通知する</td></tr><tr><td>自社プロダクト起点<br>外部SaaSから取得</td><td>自社プロダクトで新たなデータが作成されたらSalesforceを検索し関連データを自社プロダクトに取り込む</td></tr><tr><td>外部SaaS起点</td><td>Salesforceに新たなデータが作成されたら自社プロダクトに取り込む</td></tr><tr><td>スケジュール実行</td><td>毎月月初にfreee会計からデータを一括で取り込む</td></tr></tbody></table>

### Anyflow Embed の仕組み <a href="#dd9b7f06-66e0-4c2d-9f9b-5b4b483d689d" id="dd9b7f06-66e0-4c2d-9f9b-5b4b483d689d"></a>

1. SaaSベンダーは連携のロジックとUIを作成し、SDKを使って自社プロダクトに埋め込みます
2. エンドユーザーは連携UI上で連携先の認証や値の指定等の初期設定を行います
3. Anyflowは、1\~2で指定された内容を組み合わせて、ユーザーごとに連携を実行します\
   (1) SaaSベンダーにより決められたロジック\
   (2) エンドユーザーにより指定されたアカウントやパラメータ値

<figure><img src="/files/ntpl1zv8t4xMGSda6e8V" alt=""><figcaption></figcaption></figure>

### 基本的な概念 <a href="#id-0f665bd6-0408-4370-9504-ad0de1594e96" id="id-0f665bd6-0408-4370-9504-ad0de1594e96"></a>

<table><thead><tr><th width="161.5546875">概念</th><th>内容</th></tr></thead><tbody><tr><td><a href="/pages/tU0hEduApldxQeoLL8YO">トリガー</a></td><td>連携を稼働させるためのきっかけ</td></tr><tr><td><a href="/pages/qiGaRktSaZor7N4kFu1Q">アクション</a></td><td>連携が稼働した際に行う処理</td></tr><tr><td><a href="/pages/MPQjCzfH7kmCOGatJMvv">コネクタ</a></td><td>各種SaaSとの認証処理を代行し、APIの呼び出しを簡単に実現する仕組み。<br>Anyflow Embedでは認証ヘッダーの適用はコネクタにより自動で行われる。</td></tr><tr><td><a href="/pages/pP8J4tjnG9qatgfEz2wd">ウィザード</a></td><td>エンドユーザーが認証や初期設定を行うためのUI</td></tr><tr><td>ソリューション</td><td>上記を一通り含んだ連携パッケージ</td></tr><tr><td>ソリューション<br>インスタンス</td><td>1つのソリューションに対して、1エンドユーザーごとに発行される連携設定。これを元にして連携ジョブが実行される。</td></tr><tr><td><a href="/pages/JgDRVrHwwjX321W918hB">Anyflow SDK</a></td><td>ソリューションを自社プロダクトに組み込むための JavaScript SDK</td></tr></tbody></table>

***

### 次のステップ <a href="#id-841b3e1c-41c1-4f40-b02e-97498a9cab1b" id="id-841b3e1c-41c1-4f40-b02e-97498a9cab1b"></a>

* **🔰** [**トライアルツアー**](/trial-tour/start)：簡単なソリューションの作成を試す
* 🍳 [**レシピ**](/recipe/crm)：主要なカテゴリでの構築例を見る
* 🔌 [**コネクタ**](/connectors/list)：対応済のコネクタ一覧を確認する
* **🧰** [**運用/保守**](/ops/solution-history)：連携をリリースしたあとの運用や保守の仕組みを確認する
* **📄** [**ポリシー**](/policy/incident-response)：障害時の対応やサービスレベルなどのポリシーを見る


# 初期セットアップ

Anyflow Embed をスムーズに使うために、初めに設定を済ませておくと良いものを記載しています。 以下の内容を確認して、初期セットアップを完了させてください。

## **アカウントの確認**

各種アカウントやページにアクセスできるかを確認します。

* Anyflow Embed のアカウントが担当者から付与されており、ログインできる
* 【任意】 SlackコネクトでAnyflowとつながる
* 連携しようとしているSaaSのアカウントを持っている（有料のSaaSでも開発者アカウントは無料で提供されていることがあります）

## **JWTの準備**

Anyflow SDKの初期化に必要なJWTを発行するための準備を行います。

* ウィザードを埋め込むサイトの[オリジン](/release/embed/generate-jwt)をAnyflow 担当者へ共有している
* JWTに含めるiss（ベンダーID）の値を[管理画面](https://embed.anyflow.jp/settings/jwt)から取得している
* 署名の検証を行うための[公開鍵](doc:https://anyflow.readme.io/docs/generate-jwt#jwt%E3%82%AD%E3%83%BC%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B)を発行し、[管理画面](https://embed.anyflow.jp/settings/jwt)から登録している

{% hint style="success" %}

### [ウィザードホスティング](/release/wizard-hosting)を利用する場合は、この準備は不要です。

{% endhint %}

## **任意の設定**

* 【推奨】エラー発生時などに[イベント通知](/ops/event-notification)を受け取るように設定している
* [ウィザードホスティング](/release/wizard-hosting)を利用する場合はAnyflow 担当者へ伝えている
* [デプロイ環境](/release/deploy-environment)を利用する場合はAnyflow 担当者へ伝えている


# 用語集

<button type="button" class="button primary" data-action="ask" data-icon="gitbook-assistant">AIに質問する</button>

## **Anyflowシステム**

Anyflow Embedを含む、Anyflowが提供しているシステム全般を指します。

## **ベンダー**

Anyflow Embedを導入している、プロダクトを提供している事業者のことを指します。

## **ベンダーメンバー**

ベンダーに所属する人のことを指します。

## **ベンダープロダクト**

ベンダーが提供しているプロダクト（Web上で動作する製品）のことを指します。

## **エンドユーザーチーム**

ベンダープロダクトの契約をしている、エンドユーザーが所属する組織のことを指します。

## **エンドユーザー**

ベンダープロダクトを業務で使っているユーザーのことを指します。

<figure><img src="https://files.readme.io/b880d32-Project_Organizational_Chart_-_Frame_2_2.jpg" alt="2399"><figcaption><p>ベンダー、ベンダーメンバー、ベンダープロダクト、エンドユーザーチーム、エンドユーザーの関係図</p></figcaption></figure>

## **トリガー**

ソリューション(後述)を起動するきっかけになるものです。

トリガーには、

* <mark style="background-color:blue;">GoogleDriveにファイルがアップロードされた</mark>
* <mark style="background-color:blue;">Slackに特定の文字を含むメッセージが投稿された</mark>
* <mark style="background-color:blue;">Webhookのリクエストがあった</mark>

といったイベントで発火するものや、

* <mark style="background-color:blue;">毎日13時になったら実行する</mark>
* <mark style="background-color:blue;">クリックした時に実行する</mark>

といったトリガーが存在します。

## **アクション**

トリガーで発火した後に行う処理の単位です。

アクションには、

* <mark style="background-color:blue;">ベンダープロダクトのユーザーを作成する</mark>
* <mark style="background-color:blue;">ベンダープロダクトにファイルをアップロードする</mark>
* <mark style="background-color:blue;">Chatworkに投稿する</mark>
* <mark style="background-color:blue;">Gmailからメールを送信する</mark>

といったアクションが存在します。

{% hint style="success" %}

### ヒント

APIが存在するトリガーやアクションであれば、Anyflowチームが素早く追加できます。
{% endhint %}

## **コネクタ**

コネクタは、アクション、トリガー等の総称です。\
e.g. Slackコネクタ、Salesforceコネクタ

## **ソリューション**

ソリューションは、トリガーやアクション、データの変換、条件分岐や例外処理などから形成される一連の連携単位です。\
例えば、`GoogleDriveにファイルがアップロードされたら、ベンダープロダクトにファイルをアップロードする` といったエンドユーザーに提供する連携の単位のことを指します。

## **ソリューションエディター**

ソリューションエディターは、ベンダーメンバーがソリューションを作成する際に使うエディターです。\
ソリューションエディターを使って、トリガーやアクションを組み合わせながらエンドユーザーに提供する連携ソリューションを作成できます。

<figure><img src="https://files.readme.io/1726269-solution_editor.png" alt="3152"><figcaption><p>ソリューションエディター</p></figcaption></figure>

## **ウィザード**

<figure><img src="https://files.readme.io/4c6e37c-Screen_Shot_2021-04-09_at_7.26.45_PM.png" alt="804"><figcaption><p>赤枠部分がウィザード</p></figcaption></figure>

ウィザードとは、ベンダープロダクト上でエンドユーザーに実際に表示される、Anyflow Embedにより提供されるUI（ユーザーインターフェース）のことを指します。\
ウィザードでは、アプリの認証やアクションの設定を行うことができます。

## **ウィザードエディター**

ウィザードエディターは、ウィザードを作成する際に使うエディターです。\
ウィザードエディターを使うことで、ウィザードに表示する項目やテキスト、スクリーン、エンドユーザーの設定項目などを設定できます。

## **ソリューションインスタンス** <a href="#solution-instance" id="solution-instance"></a>

エンドユーザーがウィザードに固有の値を入力することで作成される、実行可能な連携の単位を指します。\
1つのソリューションに対して、1 エンドユーザーにつき、1つのソリューションインスタンスを作成できます。

## **エンドユーザー変数**

オブジェクト指向で表現すると、クラスがソリューション、ソリューションインスタンスがインスタンスになります。

ウィザードに入力する、エンドユーザーごとに異なる値を指します。\
ベンダーメンバーは、エンドユーザに入力させたい箇所を予め変数として定義することで、ウィザード上でエンドユーザーに変数を入力させることができます。

例えば、slackに投稿するというアクションに必要な`Slackのチャンネル名` 、Google Driveに保存するというアクションに必要な`GoogleDriveのフォルダ名` など、ソリューションの実行に必要となる、、エンドユーザーによって異なる値を指します。

<figure><img src="https://files.readme.io/577367d-Screen_Shot_2021-04-09_at_8.39.50_PM.png" alt="859"><figcaption><p>赤枠部分がエンドユーザー変数</p></figcaption></figure>

## **デプロイ環境**

ソリューションをデプロイする仮想的な領域を指します。\
デプロイ環境を複数用意することで、ソリューションで使用するアプリのリクエスト先を検証環境にすることが可能です。詳しくは[デプロイ環境](/release/deploy-environment)を参照してください。

## **チームインテグレーション**

エンドユーザーチーム単位で紐づいているソリューションのことを指します。\
例えば、`ベンダープロダクトに人事マスタから従業員情報を同期する`など、**管理者がプロダクト全体に設定する連携ソリューション**のことを指します。

## **ユーザーインテグレーション**

エンドユーザー単位で紐づいているソリューションのことを指します。\
例えば、`エンドユーザーにベンダープロダクト内でメンションがされたらSlackのDM通知を行う`など、**エンドユーザーが個別に設定する連携ソリューション**のことを指します。

<figure><img src="https://files.readme.io/7ab0d6b-integration_type.jpg" alt="2309"><figcaption><p>チームインテグレーション、ユーザーインテグレーションの関係図</p></figcaption></figure>

{% hint style="success" %}

### ヒント

チームインテグレーションとして利用するか、ユーザーインテグレーションとして利用するかは\
SDKの初期化時に使用するJWTのペイロードにより決定されます。\
[JWTや公開鍵を生成する](/release/embed/generate-jwt#peirdono)
{% endhint %}

## **OAuthアプリ**

Slack, Salesforce, GoogleWorkspaceなど、OAuthを利用して認証するサービスのアプリを指します。\
Anyflow Embedでは、ベンダーが作成したOAuthアプリを使ってエンドユーザーに認証を行わせるための、[カスタムOAuth](/connectors/custom-oauth-client)機能を提供しています。


# リリースノート

## ウィザードを表示するときにデフォルト値を渡せるようになりました

*2026年 3 月 18 日*

[Anyflow SDK](https://docs-embed.anyflow.jp/anyflow-sdk/docs) の新バージョン 0.16.0 から [ソリューションウィザードを iframe に読み込む](https://docs-embed.anyflow.jp/anyflow-sdk/docs#load-wizard)際に、ウィザードで使用するデフォルト値を渡せるようになりました。ウィザードを組み込む時点で決定する値をデフォルト値として採用できるようになります。

実装について詳しくは以下のサンプルコードをご覧ください。

```typescript
wizard.load("solution_id", {
  defaultInputs: [
    {
      type: "value",
      key: "...", // デフォルト値を指定するフィールドを指定するキーです。実際の値はウィザードエディタに表示されるコードサンプルを確認ください
      value: "...", //  実際のデフォルト値です。
    },
  ],
});
```

フィールドを特定するための `key` について、ベンダー管理画面のウィザードエディタに表示されるコードサンプルで実際の値を確認することができます。

デフォルト値が反映されるのは新規インストール時のみで、再インストール時には反映されません。

## ポーリングトリガーの失敗通知にエラーレスポンスが含まれるように

*2026年 3 月 2 日*

[イベント通知](/ops/event-notification)機能の「ポーリングトリガーの実行に失敗したとき」の通知について、通知内容にAPIのエラーレスポンスが含まれるようになりました。

<figure><img src="/files/v9mfXhqsIVbBrfWX4m3d" alt="" width="383"><figcaption></figcaption></figure>

※SaaSのエラーレスポンスの仕様によっては、レスポンスに意図せぬ形でセンシティブな情報が入る恐れがあるため、通知させたくない場合は管理画面から設定を変更してください。

## ソリューション一覧にタグ機能を追加

*2026年 2 月 18 日*

ソリューション一覧にタグ機能を追加しました。タグを作成し、ソリューションに付けることができます。 またタグによる絞り込みが可能です。タグで絞り込んだ状態はURLに反映されるため、\
よく使う条件をブックマークしたり、チーム内で共有したりできます。

ソリューション数が増えてきても、目的に応じて整理・抽出しやすくなります。

<div data-full-width="false"><figure><img src="/files/XharmC384zjIJWVEM4s6" alt="" width="563"><figcaption></figcaption></figure></div>

※本機能はソリューション一覧画面でご利用いただけます。

## JWT署名検証アクションを追加

*2026年 1 月 16 日*

JWTの署名を検証するアクションを追加しました。HS256、RS256、ES256など主要なアルゴリズムに対応しています。署名検証が成功するとペイロードを取得でき、後続のアクションで利用できます。

<p align="center"><br><img src="/files/I28HnRHx9h2nLFlBXclP" alt="" data-size="original"></p>

## ベンダー向け実行履歴が20件以上表示可能に

*2025年 12 月 1 日*

[ベンダー向け実行履歴](/ops/solution-history/for-venders)の画面でページを切り替える事で 21 件目以降の実行履歴が確認できるようになりました。また、新たに実行開始日と実行完了日のフィルター条件を追加しました。フィルター条件に実行開始日や実行完了日を設定する事で、表示される実行履歴が新たな実行履歴で流されないようにできます。

<figure><img src="/files/PJvyhUwcM6qYXr98Xgfb" alt="" width="375"><figcaption></figcaption></figure>

## デプロイ時のソリューション互換性チェックを改善

*2025年11月18日*

互換性のないソリューションは全てデプロイ時にエラーとなるよう修正しました。これまでは互換性チェックが不完全だったため、

* ウィザードに必須入力の項目が追加されている
* 要求スコープが追加されている

場合にもデプロイでき、エンドユーザーのインストール済みソリューションがデプロイ後動かなくなる問題がありましたが、現在はこれらの変更を互換性チェックにてエラーとし、デプロイできないようにしています。また、互換性チェックによるデプロイエラー時に、詳細情報をエラーダイアログで表示するようにしました。[詳しくはこちら](https://docs-embed.anyflow.jp/release/deploy#soryshonnonitsuite)

<figure><img src="/files/ok6JMmXmUbQ64mtEbdMK" alt="" width="188"><figcaption></figcaption></figure>

## ウィザードのボタンラベルが変更できるように

*2025年11月13日*

[ウィザード](/introduction/glossary#wizdo)の「完了ボタン」「キャンセルボタン」のラベルを「完了」「キャンセル」から自由に変更できるようになりました。例えばユーザーの設定完了後にソリューションを実行する場合には完了ボタンを「実行する」というラベルに変更するなど、組み込み方によって最適なラベルを設定していただけます。

またウィザードの右上のバツボタンを消すこともできるようになりました。ウィザードをダイアログのように組み込まない場合に、バツボタンが不自然になってしまうことへの対応です。

<figure><img src="/files/KGSZnuK0NfrybHaqACHt" alt="" width="375"><figcaption></figcaption></figure>

## エンドユーザー向け実行履歴が20件以上表示可能に

*2025年 10 月 23 日*

[エンドユーザー向け実行履歴](/ops/solution-history/for-endusers)の画面でページを切り替える事で 21 件目以降の実行履歴が確認できるようになりました。また、SDKをv0.15.0にアップデートすると[getJobsメソッド](/anyflow-sdk/docs#get-jobs)でもページネーションを実施できます。

<figure><img src="/files/l2uG6vvgGwkzkDrHBfqX" alt="" width="188"><figcaption></figcaption></figure>

## コネクタ認証失敗時の理由が表示されるように

*2025年 10 月 16 日*

ウィザードで[コネクタの認証に失敗](/ops/solution-error/auth-error#nonisuruksu)した場合、失敗理由の詳細（エラーレスポンス等）が画面に表示されるようになりました。

<figure><img src="/files/5vv88sh3yX1EBcOp8k2H" alt="" width="375"><figcaption></figcaption></figure>

## 管理画面からソリューションをアンインストール可能に

*2025年 10 月 1 日*

[ベンダー向け実行履歴](/ops/solution-history/for-venders)の画面で、ユーザーがインストールしているソリューションをアンインストールすることができるようになりました。

<figure><img src="/files/9Zks3DGwaLQ2HsENHggM" alt="" width="375"><figcaption></figcaption></figure>

## 管理画面からデプロイを削除可能に

*2025年 9 月 29 日*

ソリューションのバージョン履歴画面から、[デプロイを削除（取り消し）](/release/deploy#depuroiwosuru)することが可能になりました。既にインストールしているユーザーがいる場合には強制的にアンインストールとなります。

<figure><img src="/files/8rWGPzds1kSVAuScWIA0" alt="" width="375"><figcaption></figcaption></figure>

## カスタムアクションのスコープを増減可能に

*2025年 9 月 16 日*

認可時にスコープを要求するOAuth形式のコネクタについて、[カスタムアクション](/solution-editor/actions/api-call/custom)の設定に「スコープ」項目が追加され、ベンダー自身でそのソリューションが要求する認可スコープを増減できるようになりました。従来はカスタムアクションを利用する場合、Anyflowが設定したスコープが全て要求されるだけでなく追加もできませんでしたが、これにより柔軟なスコープ調整が可能となりました。

<figure><img src="/files/64BcUuCWOy9JAnOXYJKC" alt="" width="375"><figcaption></figcaption></figure>

## ステップのログをマスクすることが可能に

*2025年 9 月 2 日*

ソリューションの各ステップについて、それぞれログを[実行履歴](/ops/solution-history/for-venders)に保存するかどうかを選べるようになりました。デフォルトでは実行ログは保存されますが、ソリューションエディタにて3点リーダーから「データをマスク」を選択することで、そのステップでは実行ログが保存されなくなります。

現段階で対応しているステップ：アクションステップ、IFステップ、繰り返しステップ\
今後対応を予定しているステップ：トリガーステップ、レスポンスステップ

<figure><img src="/files/PWtddrxaBxD9Pk2fqpCf" alt="" width="375"><figcaption></figcaption></figure>


# コードソリューション(β版)

### 1. コードソリューションとは

{% hint style="info" %}

## &#x20;**ご利用について**

コード化ソリューションは一部のお客様のみ利用できる限定機能です。ご利用を希望される場合は、弊社CSまでお問い合わせください。
{% endhint %}

Anyflow Embed の「ソリューション」は、通常 GUI（ノーコードエディタ）でトリガーステップやアクションステップを組み立てて作成します。コードソリューションでは、そのうちアクションの実行ロジック部分を TypeScript（Deno）を使ったコードで記述します。

Embed CLI でサーバーとローカルを同期し、コーディングエージェント（Claude Code / Codex など）で実装します。複雑な分岐処理やデータ加工など、GUI のステップ形式では表現しづらいロジックを直接コードで書きたい場合にご利用ください。

コードソリューションは、管理画面でソリューションを新規作成する際に「コード」を選択することで作成します。詳細は「4. ソリューション作成の流れ」を参照ください。

<figure><img src="/files/cjz29qEukhsNI4tvK2mC" alt="コード化ソリューションのエディタ画面" width="563"><figcaption><p>コード化ソリューションのエディタ画面</p></figcaption></figure>

{% hint style="info" %}
エディタ画面ではコードの編集はできず、閲覧のみ可能です。編集はローカル環境で行ってください。
{% endhint %}

#### ■ イメージ：ソリューション構築の流れ

{% embed url="<https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2SAP0zfldVFDluPfMXkq%2Fuploads%2F7tobIkpYJ1djOSMRIPSs%2Fkinton_Slack%E3%83%87%E3%83%A2_compressed.mp4?alt=media&token=d783ff88-7be5-4eda-8114-620bde562423>" %}

### 2. 全体像

コードソリューションは次の二層で構成されます。

<table><thead><tr><th width="120.80078125">レイヤー</th><th>何を決めるか</th><th>どこで編集するか</th></tr></thead><tbody><tr><td><strong>処理部分</strong></td><td>データ取得・加工・登録などのロジック</td><td><strong>コード</strong>（<code>main.ts</code>）</td></tr><tr><td><strong>定義部分</strong></td><td>トリガー、エンドユーザー変数、ウィザード設定など</td><td><strong>管理画面（GUI）</strong><code>solution.lock</code> にスナップショットされる</td></tr></tbody></table>

定義部分には次の 3つが含まれます。現時点ではいずれも GUI 側で設定し、コードでは変更できません。

* **トリガー**: ソリューション実行の起点となるアプリとトリガーの種類、その出力スキーマ
* **エンドユーザー変数**: 導入先のエンドユーザーに入力させるフィールド
* **ウィザード設定**: エンドユーザー向けセットアップ UI（画面構成・ウィジェット・ラベル）

### 3. セットアップ

セットアップは大きく 3 つです: Deno → Embed CLI → ログイン

#### 3-1. Deno のインストール

コード化ソリューションは Deno で記述します。公式ガイドに従ってインストールしてください。

公式: <https://docs.deno.com/runtime/#quick-install>

```bash
curl -fsSL https://deno.land/install.sh | sh
```

PATH が通っているか確認します。

```bash
deno --version
# deno 2.x.x (stable, release, ...)
```

{% hint style="info" %}
補足: エディタで直接コードを見る場合は、[VS Code の Deno 拡張](https://marketplace.visualstudio.com/items?itemName=denoland.vscode-deno)を入れると型補完・診断が効きます。 `F1` → `Deno: Initialize Workspace Configuration` で有効化してください。
{% endhint %}

#### 3-2. Embed CLI のインストール

```bash
curl -fsSL https://cli.embed.anyflow.jp/install.sh | sh
```

* `embed` というファイル名のバイナリが `~/bin` に入ります。`~/bin` を PATH に通してください。
* `curl` と `unzip` が必要です。
* 動作確認:

```bash
embed version
```

{% hint style="info" %}
**Windows 環境について**: Windows 用のバイナリ配布はありません。WSL を利用してください。
{% endhint %}

#### 3-3. ログイン

```bash
embed login -o <組織名>
```

組織名は、管理画面にログインする際に使うものと同じです。

ログインは Auth0 を介した OAuth 2.0 (Authorization Code Flow) で行われます。ログインコマンドを実行するとブラウザが自動的に開きます。ブラウザを開くコマンドが見つからなかった場合、Auth0 の認可URLがコンソールに表示されます。ご自身でアクセスしていただくと認証完了します。

<figure><img src="/files/cVEhR27rwCFMNjcQzY1b" alt="認証完了時にブラウザへ表示される画面"><figcaption><p>認証完了時にブラウザへ表示される画面</p></figcaption></figure>

* ログイン状態の確認:

```bash
embed me
```

### 4. ソリューション作成の流れ

<pre data-title="全体の流れ"><code>管理画面でコードソリューションを作成
        │
        ▼
空ディレクトリを作ってサーバーからローカルへ取得 (embed pull &#x3C;solution id>)
        │
        ▼
<strong>任意で skills の追加 (npx skills add)
</strong>        │
        ▼
コードの実装 (main.ts を編集)
        │
        ▼
サーバに反映 (embed push)
</code></pre>

#### **4-1. 管理画面でコードソリューションを作成**

ソリューションは管理画面で作成します。「コード化が有効な組織」であれば、ソリューションの初期画面でコードを選べます。トリガー・エンドユーザー変数・ウィザードなどの定義部分はここで設定します。

<figure><img src="/files/Q8G8pkwekOZljs6bR9aD" alt="コード化ソリューション作成画面" width="244"><figcaption><p>コード化ソリューション作成</p></figcaption></figure>

#### **4-2. 空ディレクトリを作って pull**

```bash
mkdir my-solution && cd my-solution
git init
embed pull <solution-id>
```

pull コマンドはサーバの状態をローカルにするです。管理画面のURLに含まれる `solution-id` をコピーして pull コマンドに渡してください。ソリューション作成直後に遷移する管理画面のURLの構造を次に示します: `https://embed.anyflow.jp/solutions/<solution-id>/workflow`

{% hint style="info" %}
初回 pull はディレクトリが空であることを要求します（`.git` / `.gitignore` は例外として許可されます）。

また git 管理は必須ではありませんが、あとから変更履歴を追ったりロールバックしたりする場合は、pull の前に `git init` しておくのがおすすめです。
{% endhint %}

#### **4-3. skills を追加**（任意）

skills はコーディングエージェント向けの参照情報です。`npx skills add` コマンドで skills を追加すると、エージェントは Embed CLI の基本的な使い方に加えて、使用するアプリクライアント（`@anyflowinc/<name>`）の API リファレンスを参照できるようになります。Embed CLIおよびコードソリューションについての概観、制約、トラブルシューティングの3種類のskillを用意しています。これらの skills を入れなくても動作しますが、コーディングエージェントが実装で迷いにくくなるため追加を推奨します。

インストール範囲は用途に応じて選んでください。

```bash
npx skills add https://cli.embed.anyflow.jp          # プロジェクト単位（実行したディレクトリのみ）
npx skills add https://cli.embed.anyflow.jp -g       # マシン全体（以降作成する全ソリューションで有効）
```

* **プロジェクト単位**: `./<agent>/skills/` に追加されます。`solution.lock` などと同様に git 管理できますが、ソリューションごとに再実行が必要です。
* **マシン全体（`-g`）**: `~/<agent>/skills/` に追加されます。一度実行すれば、以降作成するソリューションで再実行は不要です。

追加時にどのエージェント向けに設定するかを選択します。追加後は、利用しているエージェントのスキル一覧から反映されているか確認できます。

#### **4-4. コードの実装**

コーディングエージェント（Claude Code / Codex など）に要件を伝えて `main.ts` を実装してもらいます。

連携可能なSaaSクライアントは `embed libs` で確認できます。

```bash
embed libs                     # 利用可能な @anyflowinc/* クライアント一覧
deno add @anyflowinc/<name>    # 必要なものを追加
```

#### **4-5. サーバーへ反映**

push コマンドはローカルの状態をサーバに同期するコマンドです。push コマンドで編集したコードをサーバに反映させます。

```bash
embed push
```

### 5. ファイル構成と所有境界

pull するとおおよそ次の構成になります。

<table><thead><tr><th width="264.9375">パス</th><th>所有者</th><th>編集してよいか</th></tr></thead><tbody><tr><td><code>main.ts</code></td><td>あなた（user）</td><td>✅</td></tr><tr><td><code>main.ts</code> が import するファイル</td><td>user</td><td>✅</td></tr><tr><td><code>deno.json</code></td><td>共有</td><td>✅ （※後述の 1 エントリだけ注意）</td></tr><tr><td><code>generated/types.ts</code></td><td>サーバー</td><td>❌  自動生成のためのため</td></tr><tr><td><code>solution.lock</code></td><td>サーバー生成 / ユーザー選択</td><td>❌ GUI 設定のスナップショットであるため</td></tr><tr><td><code>.embed/</code></td><td>CLI</td><td>❌ CLI の同期状態であるため</td></tr></tbody></table>

{% hint style="info" %}
`deno.json` は `imports` / `tasks` / `compilerOptions` など全体を編集して構いませんが、例外として `compilerOptions.types` の `"./generated/types.ts"` エントリは消さないでください。消すとソリューション固有の型が読み込まれません。
{% endhint %}

### 6. コードの書き方

#### エントリポイントは `main.ts`&#x20;

`workflow` 関数を `export` します。

```typescript
import type { TriggerOutput, WorkflowContext } from "@anyflowinc/embed-types";

export async function workflow(
  triggerOutput: TriggerOutput,
  context: WorkflowContext,
): Promise<void> {
  // ここに処理を書く
}
```

#### 入力の型を確認する（`TriggerOutput` / `EndUserInputs`）

`TriggerOutput` と `EndUserInputs` は `generated/types.ts` に定義されます。GUI で設定したトリガーステップ / エンドユーザー変数の定義によって決定します。このファイルは自動生成されるため、編集しないでください。

```typescript
// generated/types.ts （自動生成・編集しない）
declare module "@anyflowinc/embed-types" {
  interface TriggerOutput {
    /**
     * Click User Name
     * 例: "サンプルユーザ名"
     */
    click_user_name?: string;
  }
  
  interface EndUserInputs {
    slack_channel: string;
  }
}
```

#### アプリクライアント（`@anyflowinc/<name>`）

外部 SaaS への読み書きは `@anyflowinc/<name>` クライアント経由で行います。利用可能なクライアントは `embed libs` で確認し、`deno add @anyflowinc/<name>` で追加します。

### 7. 制約

#### 実行環境の制約

実行環境はサンドボックス化されています。SaaS 連携はアプリクライアント経由で行います。一般的な JS/TS ライブラリ含め、`deno add` コマンドでライブラリを自由に追加できます。

* **メモリ上限**: 1GiB
* **最長実行時間**: 60min
* **ファイルシステムへの書き込み**: 非対応

#### β版での制約

* **実行ログの確認**: コード中の console.log などは画面上のログとして表示されません。確認したい値は Slack / Google Sheets / Google Drive 等のアプリクライアント経由で出力してください。
* **動作確認:** ローカルでの実行コマンドは提供していません。変更を確認するには embed push した上で、テスト実行をしてください。ジョブの結果のみ確認できます。
* **デプロイ**: エンドユーザーへのソリューションの提供はまだできません。ソリューションの実行はテスト実行のみとなっています。
* **アプリクライアント:** GUI版のソリューションで使用できるアプリすべてには対応していません。順次追加していく予定です。
* **管理画面でのファイル閲覧:** 管理画面ではすべてのファイル内容の閲覧はできません。現在は main.ts のみ閲覧ができます。

### 8. トラブルシューティング

<table data-search="false"><thead><tr><th>症状</th><th>対処</th></tr></thead><tbody><tr><td><code>embed</code> が見つからない</td><td><code>~/bin</code> が PATH に通っているか確認 → <code>embed version</code></td></tr><tr><td>VS Code でコード補完・診断が出ない</td><td>プロジェクトで Deno 拡張を有効化（<code>F1</code> → <code>Deno: Initialize Workspace Configuration</code>）。クライアントは <code>deno add</code> で追加</td></tr><tr><td><code>triggerOutput</code> の中身が分からない</td><td><code>generated/types.ts</code> を読む</td></tr><tr><td>クライアントの正しい使い方が分からない</td><td>該当パッケージの <code>reference.md</code>（<code>node_modules/@anyflowinc/&#x3C;name>/reference.md</code>）を参照</td></tr><tr><td>実行結果・ログが見えない</td><td>「7. 現在の制約」を参照</td></tr><tr><td><code>embed push</code> がコンフリクトで止まる</td><td>マーカー解決 → 再 <code>embed pull</code>（ゼロ件で完走するとクリア）</td></tr><tr><td>Windows で動かない</td><td>WSL を使う</td></tr><tr><td>認証切れ（exit 3）</td><td>再度 <code>embed login -o &#x3C;組織名></code></td></tr></tbody></table>


# トライアルツアー初級編

Anyflow Embed を使いはじめる

## **概要**

このトライアルツアーは、Anyflow Embedを使いはじめるために必要な初期設定や、スムーズにソリューションを作成するためのステップをまとめたコース集です。

このコースを、STEP1〜4 までのひと通り終えると、Anyflow Embedのオンボーディングが完了します。\
各STEPの順番通りに、Anyflow Embedを操作しながら進めていただくことをおすすめします。

## **トライアルツアーの流れ**

### [**STEP1｜アカウント作成 〜 ソリューション作成**](/trial-tour/start/step1)

アカウントの発行手順〜ソリューションの基本設定の方法についてご案内します。

### [**STEP2｜エンドユーザー変数**](/trial-tour/start/step2)

STEP1のソリューションを活用し、エンドユーザー変数、アシストの設定方法についてご案内します。

### [**STEP3｜ifステップ**](/trial-tour/start/step3)

STEP2のソリューションを活用し、ifステップの設定方法についてご案内します。

### [**STEP4｜変数の活用、デバッグ**](/trial-tour/start/step4)

STEP1〜3のソリューションを活用し、トリガーで取得した変数をアクションで利用する方法とデバッグの方法についてご紹介します。

まずは、[STEP1｜アカウント作成 〜 ソリューション作成](/trial-tour/start/step1)にて基本的な操作をマスターしましょう！


# STEP1｜アカウント作成 〜 ソリューション作成

ログイン〜ソリューションの基本的な作成方法について

## **1.アカウント作成**

Anyflowの担当者より、アカウント作成のための招待メールが届きます。

URLをクリックします。

<figure><img src="https://files.readme.io/f45e5ee-auth0-url.png" alt=""><figcaption></figcaption></figure>

***

### **1-1.組織の入力**

ご自身の組織を入力します。\
招待メールの\[組織名]を入力します。

<figure><img src="https://files.readme.io/98ca6ad-organization.png" alt=""><figcaption></figcaption></figure>

<figure><img src="https://files.readme.io/eac2ea5-auth0-organization.png" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}

### ヒント

組織名はログインの度に入力します。忘れないようにしましょう。
{% endhint %}

***

### **1-2.ログイン**

Anyflow Embed へのログインには、以下の認証方式を設定できます。

* Googleアカウントでのログイン
* Microsoftアカウントでのログイン
* Salesforceアカウントでのログイン
* ID / パスワードでのログイン

ご利用の組織にて、どのログイン方法を有効にするかはAnyflow担当者にお知らせください。

ログイン画面にて必要な情報を入力し、ソリューション一覧画面が表示されたらログイン完了です。

<figure><img src="https://files.readme.io/c394904-sso.png" alt=""><figcaption></figcaption></figure>

***

## **2.ソリューションを作成しよう（Lv1）**

今回作成するソリューションは、**ボタンを押したら、 Slackでメッセージを投稿する**というシンプルなソリューションです。

右上の \[新規作成] から \[ソリューション名] を設定し、ソリューションを作成します。

<figure><img src="https://files.readme.io/2b729e9-new-solution.png" alt=""><figcaption></figcaption></figure>

***

### **2-1.トリガー設定**

まずは、トリガーを設定します。\
画面左の \[トリガーを設定] をクリック

<figure><img src="https://files.readme.io/76979d0-triggers.png" alt=""><figcaption></figcaption></figure>

***

今回は「ボタンを押したら」というトリガーなので、\[[Click](/solution-editor/triggers/outgoing/click-triggers)] を選択します。

<figure><img src="https://files.readme.io/9045bb4-click-triggers.png" alt=""><figcaption></figcaption></figure>

***

以上で、トリガーの設定は完了です。

<figure><img src="https://files.readme.io/15d1dfe-click-setting.png" alt=""><figcaption></figcaption></figure>

***

### **2-2.アクションの設定**

画面左の \[+] をクリック

<figure><img src="https://files.readme.io/0e6504e-.png" alt=""><figcaption></figcaption></figure>

***

\[アクション] をクリック

<figure><img src="https://files.readme.io/a4cb59c-actions.png" alt=""><figcaption></figcaption></figure>

***

今回は「Slackでメッセージを投稿する」というアクションなので、SlackBot をクリックします。

<figure><img src="https://files.readme.io/ace1971-slackbot.png" alt=""><figcaption></figcaption></figure>

***

\[メッセージを投稿] をクリック

<figure><img src="https://files.readme.io/2348ed7-post-message.png" alt=""><figcaption></figcaption></figure>

***

### **2-3.メッセージを投稿するSlackチャンネルの設定**

メッセージを投稿したいSlackのチャンネル名を、テキストで入力します。

<figure><img src="https://files.readme.io/cb9dfd7-channel.png" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}

### ヒント

投稿先のチャンネル「general」はあくまでも一例です。\
ご利用中のSlackワークスペースの状況に応じて適宜変更してください。
{% endhint %}

***

2-4.メッセージの内容を設定

\[追加] をクリック

<figure><img src="https://files.readme.io/bd0d144-add-list.png" alt=""><figcaption></figcaption></figure>

***

メッセージの入力フィールドが生成されるので、 \[メッセージ内容] に投稿したいメッセージをテキストで入力します。

<figure><img src="https://files.readme.io/5fc9e1e-message-input.png" alt=""><figcaption></figcaption></figure>

以上で、ソリューションエディターの設定は完了です。

***

## **3.ウィザードの設定**

画面左上 \[ウィザード] をクリック

<figure><img src="https://files.readme.io/4d18dc6-wizard.png" alt=""><figcaption></figcaption></figure>

***

### **3-1.アカウント認証**

今回、Slackコネクタを使用しているので、Slackアカウントを認証するための設定を行います。

画面左下をクリック

<figure><img src="https://files.readme.io/f297dc8-end-user-expansion.png" alt=""><figcaption></figcaption></figure>

***

認証するコネクタの右側の \[…] をクリックし、どのスクリーンに配置するか指定します。

<figure><img src="https://files.readme.io/183a646-screen-put.png" alt=""><figcaption></figcaption></figure>

***

### **3-2.表示するテキストを設定する**

画面左上 \[スクリーン1] をクリック

<figure><img src="https://files.readme.io/40f9418-screen1.png" alt=""><figcaption></figcaption></figure>

***

\[スクリーンタイトル] と\[スクリーンの説明] を自由に設定します。\
テキストを入力すると、ウィザードに反映されます。

<figure><img src="https://files.readme.io/46b3724-screen-title-description.png" alt=""><figcaption></figcaption></figure>

以上で、全ての設定が完了です🎉

***

## **4.テスト**

実際にソリューションが動作するかテストします。\
画面右上の \[テスト] をクリック

<figure><img src="https://files.readme.io/9ac2777-test.png" alt=""><figcaption></figcaption></figure>

***

### **4-1.アカウント認証**

Slackアカウントを認証するため、 \[新しい認証を追加] をクリックします。

<figure><img src="https://files.readme.io/02d4311-new-account.png" alt=""><figcaption></figcaption></figure>

***

Slackの認証画面が表示されるので、 \[許可する] をクリックします。

<figure><img src="https://files.readme.io/64531fc-slack-permission.png" alt=""><figcaption></figcaption></figure>

***

アカウント認証が完了したら、右下の \[完了] をクリックします。

<figure><img src="https://files.readme.io/ab66f95-done.png" alt=""><figcaption></figcaption></figure>

***

### **4-2.テスト実行**

\[完了] をクリックすると、テスト実行が開始されます。

<figure><img src="https://files.readme.io/a7e04cd-test-execution.png" alt=""><figcaption></figcaption></figure>

***

無事にテストが成功しました🎉

<figure><img src="https://files.readme.io/b269a51-test-success.png" alt=""><figcaption></figcaption></figure>

***

設定で指定したSlackのチャンネルに正しくメッセージが投稿されているか確認します。

<figure><img src="https://files.readme.io/62f684b-CleanShot_2024-01-13_at_11.47.362x.png" alt=""><figcaption></figcaption></figure>

***

## **まとめ**

今回のセクションでは、

1. アカウント作成（ログイン）
2. ソリューション作成
3. ウィザードの設定
4. テスト

といった、基本的な操作を学ぶことができました。

この一連の操作は、次のステップ以降も必ず使用する形になるので、わからないことがあった場合は、こちらのセクションを確認してみてください。

***

次は、STEP1のソリューションを活用し、Slackにメッセージを投稿する際のチャンネルを、エンドユーザーに指定してもらう方法をご紹介します。

[STEP2｜エンドユーザー変数](/trial-tour/start/step2) にお進みください。


# STEP2｜エンドユーザー変数

## **概要**

STEP2では、STEP1のソリューションを活用し、Slackにメッセージを投稿する際のチャンネルを、**エンドユーザーに指定してもらう方法**をご紹介します。

今回のソリューションは、エンドユーザー変数を設定することで実現可能になります。\
エンドユーザー変数は、簡単に設定できる上に様々なソリューションで有効的に活用可能なので、ぜひマスターしてみてください🎉

{% hint style="success" %}

### エンドユーザー変数について

今回はトライアルツアーで設定するための必要な情報のみをご紹介しております。\
エンドユーザー変数の詳細については、[こちら](/solution-editor/variables/enduser)をご確認ください。
{% endhint %}

## **1. ソリューションを作成しよう（Lv2）**

[STEP1のソリューション](/trial-tour/start/step1)にて、Slackにメッセージを投稿する際のチャンネルを、エンドユーザーに指定してもらうための設定を行います。

### **1-1. エンドユーザー変数を設定する**

エンドユーザー変数は、ソリューションエディターとウィザードエディターのどちらも設定する必要があります。

## **2.ソリューションエディターの設定**

Slackアクションをクリックします。

<figure><img src="https://files.readme.io/06da121-slack-actions.png" alt=""><figcaption></figcaption></figure>

***

\[投稿するチャンネル] に入力されているテキストをクリアし、\
\[変数] ウィンドウの \[エンドユーザー変数] をクリックします。

<figure><img src="https://files.readme.io/f6a9f53-variable-window.png" alt=""><figcaption></figcaption></figure>

***

\[追加] をクリック

<figure><img src="https://files.readme.io/3c6ddfd-end-user-variable-add.png" alt=""><figcaption></figcaption></figure>

***

\[エンドユーザー変数の名前] を任意の名前に設定します。\
今回は、Slackのチャンネル名をエンドユーザーに指定してもらうため、\[チャンネル] と指定しました。

\[型] はStringのまま、右下の \[作成する] をクリックします。

<figure><img src="https://files.readme.io/1911442-end-user-variable-setting.png" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}

### 📘型について

型の詳細については、[こちら](/solution-editor/variables#windou)をご確認ください。
{% endhint %}

***

\[保存する]をクリックすると、このように \[エンドユーザー変数] が作成されます。

![](https://files.readme.io/97d2467-end-user-variable-channel.png)

***

作成したエンドユーザー変数を、\[投稿するチャンネル] に配置します。

一度、\[投稿するチャンネル] の入力フィールドの枠内をクリックし、エンドユーザー変数を選択することで配置可能です。

<figure><img src="https://files.readme.io/0a424bf-end-user-variable-select.gif" alt=""><figcaption></figcaption></figure>

以上で、ソリューションエディターの設定は完了です。

***

## **3.ウィザードエディターの設定**

画面左上 \[ウィザード] をクリック

<figure><img src="https://files.readme.io/7821bdd-wizard-end-user-variable.png" alt=""><figcaption></figcaption></figure>

***

### **3-0.（任意）新しいスクリーンを追加する**

スクリーンを追加したい場合は、[こちら](/wizard-editor/about)の方法で追加します。\
1つのスクリーンに収めることも可能ですが、今回は新しいスクリーンを追加しています。

### **3-1.エンドユーザー変数の配置**

ソリューションエディターで設定した、エンドユーザー変数を配置します。

画面左下をクリック

<figure><img src="https://files.readme.io/7c180c1-end-user-variable-expansion.png" alt=""><figcaption></figcaption></figure>

***

配置したいエンドユーザー変数の右側の \[…] をクリックし、どのスクリーンに配置するか指定します。\
今回は、スクリーン2に配置します。

<figure><img src="https://files.readme.io/ddd1e48-end-user-variable-screen-put.png" alt=""><figcaption></figcaption></figure>

***

### **3-2.アシストを設定する**

アシストを設定することにより、エンドユーザーがSlackのチャンネルを自由に指定可能になります。

{% hint style="info" %}

### 📘アシストについて

アシストの詳細については、[こちら](/wizard-editor/widget)をご確認ください。
{% endhint %}

***

チャンネルの入力フィールドをクリックすることで、画面右サイドにエンドユーザー変数の設定画面が表示されます。

<figure><img src="https://files.readme.io/7b76736-channel-click.png" alt=""><figcaption></figcaption></figure>

***

\[入力方法] は、 \[アシスト] を選択します。

![](https://files.readme.io/3bb85bc-input.png)

***

\[Slackのチャンネル/ユーザー一覧]を選択します。

![](https://files.readme.io/2fa38cd-assist-select.png)

***

### **3-3.表示するテキストを設定する**

[STEP1](/trial-tour/start/step1#id-3-2surutekisutowosuru)と同様の方法で設定します。

<figure><img src="https://files.readme.io/b97dd90-end-user-variable-screen-title-description.png" alt=""><figcaption></figcaption></figure>

以上で、全ての設定が完了です🎉

***

## **4.テスト実行**

[STEP1](/trial-tour/start/step1#id-4tesuto)と同様の方法でテスト実行を行います。

エンドユーザー変数を配置したスクリーン2では、認証したSlackアカウントに紐付く \[チャンネル] が選択可能になりました。

<figure><img src="https://files.readme.io/05c30d9-slack-channel-list.png" alt=""><figcaption></figcaption></figure>

***

## （補足）ソリューションを複製しておく

今回のSTEP2で作成したソリューションを中級編で活用しますので、ソリューションを複製しておきましょう。

[ソリューション一覧](https://embed.anyflow.jp/solutions)から、今回作成したソリューションの複製を行います。

<figure><img src="/files/PTpTV2wEF8Lwhj5P1gcl" alt=""><figcaption></figcaption></figure>

**複製が完了するとエディタ画面が開きますので、名前を『中級編』など分かるように変更してください。**

***

## **まとめ**

今回のセクションでは、

1. エンドユーザー変数の作成/配置方法
2. アシストの設定方法

といった、応用的な内容について学ぶことができました。\
エンドユーザー変数は、様々な[データ型](/solution-editor/variables#xing)に対応しているので、今回扱ったデータ型以外もぜひお試しください。

***

## **ネクストステップ**

次は、STEP2のソリューションを活用し、指定の内容で条件分岐する方法をご紹介します。

[STEP3｜ifステップ ](/trial-tour/start/step3)にお進みください。


# Copy of STEP2｜エンドユーザー変数

## **概要**

STEP2では、STEP1のソリューションを活用し、Slackにメッセージを投稿する際のチャンネルを、**エンドユーザーに指定してもらう方法**をご紹介します。

今回のソリューションは、エンドユーザー変数を設定することで実現可能になります。\
エンドユーザー変数は、簡単に設定できる上に様々なソリューションで有効的に活用可能なので、ぜひマスターしてみてください🎉

{% hint style="success" %}

### エンドユーザー変数について

今回はトライアルツアーで設定するための必要な情報のみをご紹介しております。\
エンドユーザー変数の詳細については、[こちら](/solution-editor/variables/enduser)をご確認ください。
{% endhint %}

## **1. ソリューションを作成しよう（Lv2）**

[STEP1のソリューション](/trial-tour/start/step1)にて、Slackにメッセージを投稿する際のチャンネルを、エンドユーザーに指定してもらうための設定を行います。

### **1-1. エンドユーザー変数を設定する**

エンドユーザー変数は、ソリューションエディターとウィザードエディターのどちらも設定する必要があります。

## **2.ソリューションエディターの設定**

Slackアクションをクリックします。

<figure><img src="https://files.readme.io/06da121-slack-actions.png" alt=""><figcaption></figcaption></figure>

***

\[投稿するチャンネル] に入力されているテキストをクリアし、\
\[変数] ウィンドウの \[エンドユーザー変数] をクリックします。

<figure><img src="https://files.readme.io/f6a9f53-variable-window.png" alt=""><figcaption></figcaption></figure>

***

\[追加] をクリック

<figure><img src="https://files.readme.io/3c6ddfd-end-user-variable-add.png" alt=""><figcaption></figcaption></figure>

***

\[エンドユーザー変数の名前] を任意の名前に設定します。\
今回は、Slackのチャンネル名をエンドユーザーに指定してもらうため、\[チャンネル] と指定しました。

\[型] はStringのまま、右下の \[作成する] をクリックします。

<figure><img src="https://files.readme.io/1911442-end-user-variable-setting.png" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}

### 📘型について

型の詳細については、[こちら](/solution-editor/variables#windou)をご確認ください。
{% endhint %}

***

\[保存する]をクリックすると、このように \[エンドユーザー変数] が作成されます。

![](https://files.readme.io/97d2467-end-user-variable-channel.png)

***

作成したエンドユーザー変数を、\[投稿するチャンネル] に配置します。

一度、\[投稿するチャンネル] の入力フィールドの枠内をクリックし、エンドユーザー変数を選択することで配置可能です。

<figure><img src="https://files.readme.io/0a424bf-end-user-variable-select.gif" alt=""><figcaption></figcaption></figure>

以上で、ソリューションエディターの設定は完了です。

***

## **3.ウィザードエディターの設定**

画面左上 \[ウィザード] をクリック

<figure><img src="https://files.readme.io/7821bdd-wizard-end-user-variable.png" alt=""><figcaption></figcaption></figure>

***

### **3-0.（任意）新しいスクリーンを追加する**

スクリーンを追加したい場合は、[こちら](/wizard-editor/about)の方法で追加します。\
1つのスクリーンに収めることも可能ですが、今回は新しいスクリーンを追加しています。

### **3-1.エンドユーザー変数の配置**

ソリューションエディターで設定した、エンドユーザー変数を配置します。

画面左下をクリック

<figure><img src="https://files.readme.io/7c180c1-end-user-variable-expansion.png" alt=""><figcaption></figcaption></figure>

***

配置したいエンドユーザー変数の右側の \[…] をクリックし、どのスクリーンに配置するか指定します。\
今回は、スクリーン2に配置します。

<figure><img src="https://files.readme.io/ddd1e48-end-user-variable-screen-put.png" alt=""><figcaption></figcaption></figure>

***

### **3-2.アシストを設定する**

アシストを設定することにより、エンドユーザーがSlackのチャンネルを自由に指定可能になります。

{% hint style="info" %}

### 📘アシストについて

アシストの詳細については、[こちら](/wizard-editor/widget)をご確認ください。
{% endhint %}

***

チャンネルの入力フィールドをクリックすることで、画面右サイドにエンドユーザー変数の設定画面が表示されます。

<figure><img src="https://files.readme.io/7b76736-channel-click.png" alt=""><figcaption></figcaption></figure>

***

\[入力方法] は、 \[アシスト] を選択します。

![](https://files.readme.io/3bb85bc-input.png)

***

\[Slackのチャンネル/ユーザー一覧]を選択します。

![](https://files.readme.io/2fa38cd-assist-select.png)

***

### **3-3.表示するテキストを設定する**

[STEP1](/trial-tour/start/step1#id-3-2surutekisutowosuru)と同様の方法で設定します。

<figure><img src="https://files.readme.io/b97dd90-end-user-variable-screen-title-description.png" alt=""><figcaption></figcaption></figure>

以上で、全ての設定が完了です🎉

***

## **4.テスト実行**

[STEP1](/trial-tour/start/step1#id-4tesuto)と同様の方法でテスト実行を行います。

エンドユーザー変数を配置したスクリーン2では、認証したSlackアカウントに紐付く \[チャンネル] が選択可能になりました。

<figure><img src="https://files.readme.io/05c30d9-slack-channel-list.png" alt=""><figcaption></figcaption></figure>

***

## **まとめ**

今回のセクションでは、

1. エンドユーザー変数の作成/配置方法
2. アシストの設定方法

といった、応用的な内容について学ぶことができました。\
エンドユーザー変数は、様々な[データ型](/solution-editor/variables#xing)に対応しているので、今回扱ったデータ型以外もぜひお試しください。

***

## **ネクストステップ**

次は、STEP2のソリューションを活用し、指定の内容で条件分岐する方法をご紹介します。

[STEP3｜ifステップ ](/trial-tour/start/step3)にお進みください。


# STEP3｜ifステップ

条件分岐

## **概要**

STEP3では、STEP2のソリューションを活用し、**ソリューションの実行内容を条件分岐させる方法**をご紹介します。

今回のソリューションは、ifステップを設定することで実現可能になります。\
ifステップは、STEP2でマスターしたエンドユーザー変数なども指定条件として利用可能です。\
ぜひマスターしてみてください🎉

{% hint style="success" %}

### ifステップについて

今回はトライアルツアーで設定するための必要な情報のみをご紹介しております。\
ifステップの詳細については、[こちら](/solution-editor/logic/if)をご確認ください。
{% endhint %}

## **1.ソリューションを作成しよう（Lv3）**

[STEP2のソリューション](/trial-tour/start/step2)にて、「Slackのメッセージ投稿チャンネルが、\[# general]の場合にAというメッセージを投稿とする」といった、簡単なソリューションを設定します。

## **2. ifステップの設定**

### **2-1.ifステップを追加する**

トリガーとアクションの間にカーソルを合わせ、\[+] ボタンをクリックします。

<figure><img src="https://files.readme.io/db896b1-if-step-add.png" alt=""><figcaption></figcaption></figure>

***

\[ステップを追加] から \[ifステップ] を選択します。

<figure><img src="https://files.readme.io/97bdedd-if-step.png" alt=""><figcaption></figcaption></figure>

### **2-2. 条件を指定する**

今回は、Slackのメッセージを投稿するチャンネルが、 \[# general]の場合という条件指定をします。

### **2-3. チャンネル名が\[general]の場合の設定**

画面右側に、ifの設定画面が表示されるので、以下のように設定します。

* データ : エンドユーザー変数（STEP2で作成したもの）
* 状態 : \[等しい]
* 値 : \[# general のチャンネルID]（例:C54MBHJ5P）

{% hint style="danger" %}

### 指定する条件の値について

今回は、エンドユーザーが指定したSlackのチャンネル名が \[# general] の場合という条件指定ですが、\
条件指定する値の入力フィールドには、\[# general] のチャンネルID（例:`C54MBHJ5P`）を指定することで、条件指定が可能になります。\
（APIで取り扱うデータを指定する必要があるため）

チャンネル名（例:`general`）を入力してもエラーとなりますので、ご注意下さい。
{% endhint %}

上記の設定により、**Slackのチャンネル名が \[# general] だったら**という条件指定がされました。

<figure><img src="https://files.readme.io/1c349df-if-conditions.png" alt=""><figcaption></figcaption></figure>

***

### **2-4.メッセージの内容を指定する**

\[if]の下にある、\[Yes]の線上にカーソルを合わせ、\[+] ボタンをクリックします。

<figure><img src="https://files.readme.io/6426881-if-yes.png" alt=""><figcaption></figcaption></figure>

***

\[アクション] をクリック

<figure><img src="https://files.readme.io/653d06c-if-yes-actions.png" alt=""><figcaption></figcaption></figure>

***

\[SlackBot] アクションを選択し、\[メッセージを投稿] を選択します。

<figure><img src="https://files.readme.io/5908e8f-slacbot-yes-actions.png" alt=""><figcaption></figcaption></figure>

***

* 投稿するチャンネル : \[エンドユーザー変数] を選択
* メッセージ : テキストを入力します。

<figure><img src="https://files.readme.io/a5014cc-slacbot-yes-message.png" alt=""><figcaption></figcaption></figure>

***

4 のSlackアクションを削除します。\
該当アクションの右側の \[…] をクリックし、\[削除] を選択します。

<figure><img src="https://files.readme.io/7c327c4-actions-delete.png" alt=""><figcaption></figcaption></figure>

***

アクションが削除されました。

<figure><img src="https://files.readme.io/0b83dc9-setting-done.png" alt=""><figcaption></figcaption></figure>

以上で、全ての設定が完了です🎉

***

## **3.テスト実行**

[STEP1](/trial-tour/start/step1#id-4tesuto)と同様の方法でテスト実行を行います。\
ifステップで指定したSlackのチャンネルに正しくメッセージが投稿されているか確認します。

また、テストの実行履歴が確認可能です。\
今回は、\[ifステップ] の \[入力値] を確認すると`true`になっているため、指定した条件が合致しているといった結果になっています。

<figure><img src="https://files.readme.io/eae9fbc-test-result.png" alt=""><figcaption></figcaption></figure>

***

## **まとめ**

今回のセクションでは、ifステップについて学ぶことができました。\
その他、様々な条件指定が可能なので、様々な条件を試してみてください。

***

## **ネクストステップ**

次は、STEP1〜3のソリューションを活用し、変数を使用したソリューションの方法とデバッグの方法をご紹介します。\
[STEP4｜変数の活用、デバッグ](/trial-tour/start/step4) にお進みください。


# STEP4｜変数の活用、デバッグ

トリガーやアクションで取得した変数を活用する、デバッグの方法について

## **概要**

STEP4では、STEP1〜3のソリューションを活用し、**トリガーで取得した変数をアクションで利用する方法**と**デバッグの方法について**ご紹介します。

こちらは、どのソリューションでも活用可能なのでぜひマスターしてみてください🎉

## **1.ソリューションを作成しよう（Lv4）**

Lv3のソリューションのトリガーを、Google Driveトリガーに変更し、\
Google Driveのフォルダにファイル/フォルダが作成された際に、トリガーで取得した情報をSlackのメッセージで投稿するソリューションを設定します。

### **1-1.トリガーの設定**

Google Driveトリガーを選択します。

<figure><img src="https://files.readme.io/924a30a-google-drive-triggers.png" alt=""><figcaption></figcaption></figure>

***

フォルダIDを、テキストで直接入力します。

<figure><img src="https://files.readme.io/1f44eb8-folder-id.png" alt=""><figcaption></figcaption></figure>

***

フォルダIDは、Google DriveのURLから取得します。

<figure><img src="https://files.readme.io/94068ec-google-drive-folder-id.png" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}

### エンドユーザーにフォルダを指定してもらう方法について

上記のように、フォルダIDでフォルダを直接指定することも可能ですが、エンドユーザーにフォルダを選択してもらうことも可能です。\
詳細の設定方法については、[エンドユーザー変数](/solution-editor/variables/enduser) をご確認ください。
{% endhint %}

***

### **1-2.アクションの設定**

SlackBotアクションの、メッセージ内容欄にカーソルを合わせクリックします。\
クリックすると、左側に変数ウィンドウが表示されます。\
変数ウィンドウからトリガー名の項目をクリックします。

<figure><img src="https://files.readme.io/24b674b-variables-select.png" alt=""><figcaption></figcaption></figure>

***

クリックすると、変数一覧が表示されます。

<figure><img src="https://files.readme.io/3da3f36-variables-list.png" alt="" width="375"><figcaption></figcaption></figure>

***

メッセージ内容をテキストで入力し、変数ウィンドウから使用したい変数を選択します。

<figure><img src="https://files.readme.io/86d65d3-variables-select-message.png" alt=""><figcaption></figcaption></figure>

以上で、ソリューションエディターの設定は完了です。

***

## **2.ウィザードエディターの設定**

今回、Google Driveのコネクタを追加したので、Google Driveのアカウント認証するための設定を行います。\
[STEP1](/trial-tour/start/step1#id-3-1akaunto)と同様の方法で設定します。

<figure><img src="https://files.readme.io/766500b-google-drive-account.png" alt=""><figcaption></figcaption></figure>

以上で、全ての設定が完了です🎉

***

## **3.テスト実行**

[STEP1](/trial-tour/start/step1#id-4tesuto)と同様の方法でテスト実行を行います。

<figure><img src="https://files.readme.io/b403376-test-result-variables.png" alt=""><figcaption></figcaption></figure>

無事にテストが成功しました🎉

***

設定で指定した変数が正しくメッセージ内容に反映されているか確認します。

<figure><img src="https://files.readme.io/f75761b-CleanShot_2024-01-13_at_11.44.572x.png" alt="" width="563"><figcaption></figcaption></figure>

***

## **4.デバッグ**

もしテスト実行が失敗した場合は、エラーになったステップが赤枠で表示され、デバッグタブに<mark style="color:red;">赤文字</mark>でエラーメッセージが表示されます。

<figure><img src="https://files.readme.io/4ada802-debug-tab.png" alt=""><figcaption></figcaption></figure>

エラーメッセージは、エラーになったステップのアプリから返ってきたAPIのメッセージが表示されています。\
すなわち、上記画像の `channel_not_found` は、Slackから返ってきたエラーメッセージになっています。

***

### **4-1.デバッグ方法**

エラー原因を特定するためのヒントとしては、<mark style="color:red;">赤文字</mark>のエラーメッセージが大きなヒントとなるので、一番はじめにエラーメッセージを確認することをおすすめします。

エラーメッセージが解読できない場合は、エラーになったアプリのエラーメッセージを検索するなどして、ソリューションの組み立てとテストを繰り返しソリューションを構築していきます。

### **4-2.エラー解消に向けて**

今回は、デバッグの方法をお伝えする例として、以下を題材に説明します。

<figure><img src="https://files.readme.io/b34c26d-debug-error.png" alt=""><figcaption></figcaption></figure>

エラーメッセージを確認すると、`channel_not_found` となっており、直訳すると `チャンネルが見つかりません` という内容になります。\
上記を踏まえて、"Slackでメッセージを投稿する際に指定しているチャンネルが見つからない可能性がある" という仮説を立てます。

***

### **4-3.ソリューションエディターを確認する**

エラーになったステップが赤枠で表示されているので、該当のステップをソリューションエディターから確認します。

<figure><img src="https://files.readme.io/45c6e75-debug-slack-actions.png" alt=""><figcaption></figcaption></figure>

***

`チャンネルが見つかりません` というエラーメッセージだったので、\[投稿するチャンネル] を確認します。

<figure><img src="https://files.readme.io/19b3553-slack-channel-id.png" alt=""><figcaption></figcaption></figure>

確認すると、本来 `CU95KHWMC` というSlack IDのチャンネルを指定していたはずが、末尾のテキストが抜けて、`CU95KHWM`というチャンネルにメッセージを投稿するように指定していました。

`CU95KHWM`というチャンネルは存在しないため、エラーが発生したということになります。

***

### **4-3.設定を修正する**

上記にて原因が判明したため、SlackのチャンネルIDを正しい形で入力し、もう一度テスト実行をしてみましょう。

<figure><img src="https://files.readme.io/84a2a34-debug-test-result.png" alt=""><figcaption></figcaption></figure>

無事にテストが成功しました🎉

***

今回は、エラーメッセージをヒントにすぐに解決に辿り着きましたが、エラーメッセージのみで原因がわからない場合は、入力値タブや出力値タブを確認しながらソリューションの組み方に問題がないかを確認します。

<figure><img src="https://files.readme.io/2b72516-error-input.png" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}

### ヒント

お客様でトライアンドエラーの結果、解決できないエラーについてはAnyflowのカスタマーサクセスチームにご連絡ください。
{% endhint %}

***

## **まとめ**

今回のセクションでは、トリガーで取得した変数を後続のアクションで使用する方法とデバッグの方法について学ぶことができました。\
変数については、トリガーだけではなくアクションで取得した変数も使用可能なので、様々な内容を試してみてください。

{% hint style="success" %}

### 独自のSlack Bot を設定したい場合

今回のトライアルツアーでは、SlackBotコネクタにデフォルトで設定してあるAnyflow の Bot からメッセージ投稿を行いました。独自のSlack Bot を設定したい場合は以下のレシピを参考にしてください。

[レシピ | 独自のSlackBotを設定する](/recipe/communication/slackbot-custom-original-bot)
{% endhint %}

***

## **トライアルツアーが初級編が終わったら**

余力があれば、ぜひ中級編のトライアルツアーに進みましょう🏃

中級編のツアーでは、自社の独自アクションや独自トリガーを作成することで、より自社プロダクトに合ったソリューションを作成できるように説明していきます。

### 👉いざ、中級編へ

[🏃 トライアルツアー中級編](/trial-tour/start-intermediate)


# 動画チュートリアル

## **チュートリアル**

### \[初級編]GoogleDriveにアップロードされたファイルをSlackに通知する

{% embed url="<https://youtu.be/EWBp3uziEVY?feature=shared>" %}


# トライアルツアー中級編

Anyflow Embed を使いこなす

## **概要**

初級のトライアルツアー、お疲れ様でした！！\
Anyflow Embedの基本的な仕組みは理解できたでしょうか。

中級のトライアルツアーでは少しレベルを上げて、自社プロダクトと連携するための1例をご紹介します。\
今回はRequestトリガーを使用した連携をご紹介します。

## **トライアルツアー中級編の流れ**

### [**STEP1｜Requestトリガー**](/trial-tour/start-intermediate/step1)

APIリクエストをきっかけにソリューションを実行する方法についてご案内します。

### [**STEP2｜Responseステップ**](/trial-tour/start-intermediate/step2)

リクエストペイロードの値を条件分岐で判定し、異なる処理を実行する方法についてご案内します。

### [**STEP3｜スキーマの共通化**](/trial-tour/start-intermediate/step3)

異なるアプリケーション間でフィールド名が異なるデータを、統一された形式に変換して扱う方法についてご案内します。

まずは、[STEP1｜Requestトリガー](/trial-tour/start-intermediate/step1)にて基本的な操作をマスターしましょう！


# STEP1 | Requestトリガー

## **概要**

中級編では、**Requestトリガー**を紹介します。

Requestトリガーを使用すると、自社プロダクトで発生した任意のイベントをもとに Anyflow のソリューションを実行することができます。

**Request を使用したソリューションを実行するまでの流れ：**

1. ソリューションのトリガーにRequest\&Responceを使用する
2. 自社プロダクトから、RequestトリガーのエンドポイントにAPIリクエストを送信する（solution\_instance\_idとpayloadを指定する）
3. Requestをトリガーにしたソリューションが実行され、レスポンスが返される

***

今回は、トライアルツアー初級編のSTEP2で作成したソリューションを利用します。

目指すべきゴールを端的に示すと以下の通りです。

<table><thead><tr><th width="111.6640625">種類</th><th width="297.28515625">Before</th><th width="299.08984375">After</th></tr></thead><tbody><tr><td>トリガー</td><td>クリック</td><td>Request&#x26;Response</td></tr><tr><td>アクション</td><td>Slack Bot（固定のメッセージを投稿）</td><td>Slack Bot（動的なメッセージを投稿）</td></tr></tbody></table>

{% hint style="success" %}

### Request\&Responseトリガーについて

今回はトライアルツアーで設定するための必要な情報のみをご紹介しております。\
Request\&Responseトリガーの詳細については、[こちら](/solution-editor/triggers/outgoing/request-triggers)をご確認ください。
{% endhint %}

***

## **0.中級編の準備をする**

中級用のツアーを始める準備を行います。

### 0-1.API Secretを発行する

Requestトリガーを利用するには、API Secretを発行しておく必要があります。\
最初にAPI Secretを発行しておきましょう。

\[設定]にあるAPI Secretを発行してください。\
※API Secretの発行は1度のみとなります。

<figure><img src="/files/mkHXV8tT8yajeFmXSDAX" alt=""><figcaption></figcaption></figure>

### **0-2.複製したソリューションを開く**

[初級編のSTEP2](/trial-tour/start/step2)で作成したソリューションを活用します。

複製したソリューションを開いてください。

***

## **1.トリガーを変更する**

### 1-1.Requestトリガーを設定する

1ステップ目の\[Click]を\[Request\&Response]トリガーに変更します。

<figure><img src="/files/GL5aNuqEPeou6qqNBk1e" alt=""><figcaption></figcaption></figure>

### 1-2.レスポンス定義を設定する

レスポンス定義を入力していきます。

リストを追加し、レスポンス名を任意で設定します。\
今回は\[ok]というテキストを入力します。

レスポンスペイロードを設定するため手動追加を選択します。\
名前は任意で構いません。今回は名前を\[ok]、型を`String`で追加します。

<figure><img src="/files/NkrtBUhFyHMa4NJdlpHb" alt=""><figcaption></figcaption></figure>

### 1-3.Slack Botのアクションの設定を確認する

今回は初級編STEP2で設定した内容をそのまま利用しますので、設定の変更はありません。

### 1-4.レスポンスを設定する

`+`ボタンをクリックし、\[レスポンス]を選択します。

<figure><img src="/files/hrZ3Wusg3RVwZPpKxOBh" alt=""><figcaption></figcaption></figure>

レスポンスの設定は下記の通りに設定します。

実行ステータス：`成功にする`を選択

レスポンス名：プルダウンから`ok`を選択します。\
※プルダウンが表示されない場合は1-2のレスポンス定義の設定をご確認ください。

ペイロードのオブジェクトに\[ok]と入力します。

<figure><img src="/files/T9MvOO1wRHvvunDwqRL2" alt=""><figcaption></figcaption></figure>

### 1-5.ウィザードの設定を確認する

今回は初級編STEP2で設定した内容をそのまま利用しますので、設定の変更はありません。

### 1-6.テスト実行

ソリューションが動作するかテストします。画面右上の\[テスト]ボタンをクリックします。

Slackアカウントの認証、チャンネルの選択は初級編STEP2と同様に設定し、\[完了] をクリックすると、テスト実行が開始されます。

request＆responseトリガーの場合、リクエストが送信されないとテストは完了しません。

まずはcURLをコピーします。

ターミナル（Mac）、コマンドプロンプト（Windows）等のご自身の環境からcURLを貼り付けてリクエストを送信してください。

<figure><img src="/files/SjTzP6LApQOldlqCGooe" alt="" width="375"><figcaption></figcaption></figure>

成功するとSlackにメッセージが届きます。

また\[ok]というレスポンスを設定しましたので、ちゃんとレスポンスが返ってきているか確認しましょう。

<figure><img src="/files/0hII6SS7otlvNmVZMTNY" alt="" width="563"><figcaption></figcaption></figure>

これでRequestトリガーによる固定のメッセージを送信することができました。

## 2.リクエストを追加してみる

次に動的なメッセージを送るための設定を確認していきましょう。

### **2-1. Request＆Responseにレスポンスペイロードを設定する**

\[リクエストが送信された際に実行]をクリックし、リクエストペイロードで手動追加を選択します。

名前は\[message]、型は`Stringとして`設定し、**任意項目にするにチェック**を入れます。

※設定すると上段にあるリクエストサンプルにmassageの項目が追加されます。

<figure><img src="/files/viZnAUNHCeAPGTgqZLLS" alt=""><figcaption></figcaption></figure>

### 2-2.Slackのメッセージ内容を変更する

\[メッセージを投稿]をクリックします。

リストを下記の通りに設定します。

入力タイプ：`テキスト` を選択します。

メッセージ内容：変数のステップ1\[リクエストが送信された際に実行]からmessageを選択します。

<figure><img src="/files/mM7VyFN008sqOU6s8DxM" alt=""><figcaption></figcaption></figure>

### 2-3.ウィザードの確認

今回は変更点がありませんので、設定の変更は不要です。

### 2-4.テスト実行

[1-5.ウィザードの設定を確認する](#id-1-5wizdonowosuru)と同様のテストを行います。ただし、注意が必要です。

今回はリクエストペイロードに`message`を追加しているので、cURLをコピーしてそのまま実行してもメッセージが空欄であるためテストに失敗します。

ご自身の環境からリクエスト送信を実行する前に、コピーしたcURLの`message`に任意の文字列を入力してから実行してください。

成功するとSlackにメッセージが投稿されます。\
messageに入力した文字列が正しくメッセージが投稿されているか確認しましょう。

***

## **まとめ**

中級編 STEP1 お疲れ様でした。

今回のセクションでは、Request\&Responseの基礎について学ぶことができました。

Request\&Responseを使うと取りたいデータをリクエストとして外部アプリケーションと連携し、レスポンスを受け取ることができます。

初級編と比べてボリュームも増えていますので、不明点があればAnyflow CSチームにご連絡ください。

***

## **ネクストステップ**

次は、Slackのユーザー一覧を取得してメンションしたメッセージを投稿する方法を学びましょう。

[STEP2 |取得したデータを活用する](/trial-tour/start-intermediate/step2)

にお進みください。


# STEP2 | Resposeステップ

## **概要**

中級STEP1では、Requestトリガーを使ったSlackへのメッセージ投稿に成功しました。\
中級STEP2ではさらにレスポンスを取得して活用する方法を紹介します。

STEP1とSTEP2の連携の流れは下記のとおりです。STEP2ではこの流れを成功するソリューションを作成していきます。

***

## 1.メッセージ投稿をスキップする

Slackからユーザーの一覧を取得部分のテストに成功するまで、スキップを設定してみましょう。

ソリューションでは作成したソリューションをスキップする設定が可能です。

メッセージを投稿のステップにある三点リーダーをクリックしてスキップします。

同様にレスポンスもスキップしてください。

<figure><img src="/files/tCGvWmqG8eiSSEn2puMi" alt="" width="375"><figcaption></figcaption></figure>

***

## 2.ペイロードの設定を追加する

STEP1ではmessageを動的に投稿するために\[リクエストが送信された際に実行]のリクエストペイロードに\[message]を設定しました。

それに加え、Slackからユーザー一覧を取得できるようにRequest＆Responseトリガーを設定していきましょう。

### 2-1.リクエストペイロードの追加

* \[リクエストが送信された際に実行]をクリックします。
* リクエストペイロードを追加します。JSONまたは手動で追加できます。

{% tabs %}
{% tab title="{}JSONで追加" %}
まず、messageがペイロードに存在しているため削除してください。\
JSONで追加を選択すると、JSONを入力するモーダルが表示されるので、以下のJSONをコピーして貼り付けます。任意項目にするにチェックを入れてください。

```
{
"message": "こんにちは",
"mention_id": "1",
"email": "test@anyflow.co.jp",
"action": "search"
}
```

{% endtab %}

{% tab title="手動追加" %}
すでにmessageのスキーマは設定されているので、追加で下記3つを追加します。

* 名前\[mention\_id]、型\[String]で、任意項目にするにチェックを入れて追加します。
* 名前\[email]、型\[String]で、任意項目にするにチェックを入れて追加します。
* 名前\[action]、型\[String]で、追加します。
  {% endtab %}
  {% endtabs %}

<figure><img src="/files/WTzi6gqZeQeg0FlCbjwm" alt="" width="545"><figcaption></figcaption></figure>

### 2-2.レスポンスペイロードの設定

レスポンスペイロード追加を選択します。

* レスポンス名は自由です。今回は\[user\_list]とします。
* レスポンスペイロードを追加します。JSONまたは手動で追加できます。

{% tabs %}
{% tab title="{}JSONで追加" %}
JSONを入力するモーダルが表示されるので、以下のJSONをコピーして貼り付けます。

```
{  
  "users": [  
    {  
      "id": "1",  
      "email": "test@anyflow.co.jp"  
    }  
  ]  
}
```

{% endtab %}

{% tab title="手動追加" %}
追加するペイロードは下記の4つです。

* 名前\[users]、型\[Array]で、追加します。
* 名前\[element]、型\[Object]で、任意項目にするにチェックを入れて追加します。
* 名前\[id]、型\[String]で、任意項目にするにチェックを入れて追加します。
* 名前\[email]、型\[string]で、任意項目にするにチェックを入れて追加します。

階層を設定します。\
`elemenet`を`users`の配下に移動します。\
左側にマウスを持っていくと手のカーソルになるので、ドラック&ドロップで移動させます。\
同様に`id`と`email`を`element`配下に移動させます。これにより`users`は3階層となりました。
{% endtab %}
{% endtabs %}

<figure><img src="/files/y1BhVOqwpDpPlRRCBjz2" alt=""><figcaption></figcaption></figure>

***

## 3.ユーザーの一覧を取得する

### 3-1.\[if]を設定する

{% hint style="success" %}

### ifロジックについて

今回はトライアルツアーで設定するための必要な情報のみをご紹介しております。\
ifロジックの詳細については、[こちら](/solution-editor/logic/if)をご確認ください。
{% endhint %}

スキップしたステップの上に新たなステップを追加します。

トリガーとアクションの間にカーソルを合わせ、\[+]ボタンから、\[if]を選択します。

<figure><img src="/files/binHe4wl1rINCxGxOnQM" alt="" width="563"><figcaption></figcaption></figure>

リクエストペイロードで設定した`action`が`search`という値と等しいか？をチェックします。

* データ：変数のStep1にある`action`を選択します。
* 状態：`等しい`を選択します。
* 値：\[search]と入力します。

<figure><img src="/files/lDZu7LBdsPFS9qBRTz78" alt="" width="557"><figcaption></figcaption></figure>

### 3-2.Slack Bot ユーザー一覧を取得を設定する

Yes側の\[+]ボタンをクリックし、\[アクション]から\[Slack Bot]を選択します。

* \[ユーザー一覧を取得]を選択します。
  * 取得件数：Slackの仕様上、200以下が推奨です。今回は200と設定します。
  * カーソルとロケールを含む：今回は設定不要です。

<figure><img src="/files/kp8pNmzW6k3kOOuZCi3d" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}

### ページネーションをしたい場合は

複数回APIを呼び出しをして全件のデータを呼び出すにはこちらを確認してください。\
カーソルの設定については[こちら](/solution-editor/logic/pagination)ページをご確認ください。
{% endhint %}

### 3-3.レスポンスを設定する

<figure><img src="/files/jWPxH2lGM5FdPvoH8DG1" alt="" width="563"><figcaption></figcaption></figure>

* \[+]ボタンからレスポンスを追加します。
* 実行ステータス：`成功にする`を選択します。
* レスポンス名：\[リクエストが送信された際の実行]で作成した`user_list`を選択します。
* リストソース：変数からステップ3の\[ユーザー一覧を取得]にある`Members`を選択します。
* オブジェクトは下記の通り設定してください。
  * id：変数にあるステップ3の\[ユーザー一覧を取得]にある\[`i番目のMember`]を展開して`Id`を選択します。
  * email：変数にあるステップ3の\[ユーザー一覧を取得]にある`i番目のNember`を展開し、さらに`Profile`を展開して`Email`を選択します。

<figure><img src="/files/9wd8geRTgh7oMIsRxvSs" alt=""><figcaption></figcaption></figure>

***

## 4.ユーザー一覧を取得できるかテストする

ここまでの設定ができたらユーザー一覧が取得できるかテストしてみましょう。\
ウィザードは現在設定している状態のままで大丈夫です。

* テストに進むと認証の画面が表示されます。\
  任意のチャンネルを指定して、完了ボタンを押してください。\
  ※ユーザー一覧の取得のテストですので、チャンネルにメッセージの投稿はされません。
* cURLをコピーし、ご自身の環境からリクエストを送信してテストを実行してください。
* 今回はユーザー一覧を取得するテストです。\
  actionにsearchを指定する必要があります。下記のサンプルを参考に実行してください。

```jsx
curl https://embed-vender-api.anyflow.jp/request_trigger \
  --request POST \
  --header "Authorization: Bearer [API_TOKEN]" \
  --header "Content-Type: application/json" \
  --data '{
    "solution_instance_id": "[solution_instance_id]",
    "payload": {
      "message": "",
      "mention_id": "",
      "email": "",
      "action": "search"
    }
  }'
```

成功すると、ユーザー一覧を取得ができレスポンスとしてidがアプリ側に返って返ってきていることが分かります。

<figure><img src="/files/jmj9xuzGeGpjeJ2BXqUP" alt=""><figcaption></figcaption></figure>

***

## 5.メンションを付けてメッセージを投稿する

上記によってSlackからユーザー一覧を取得することに成功しました。

次にユーザー一覧から取得したIDを活用して、メンションをつけてメッセージを送付してみましょう。

### 5-1.メッセージを送信する設定をする

actionがsearchだった場合は、ユーザー一覧を取得するように設定しました。\
次に、actionがsearch以外だった場合は、メッセージを投稿するように設定しましょう。

この場合、elseを活用します。\
ifステップの3点リーダをクリックし、elseを選択します。\
選択するとNoの先にelseが追加されます。これによりactionがsearch以外だった時の動きを設定できるようになりました。

<figure><img src="/files/OxRNy4YJueRR6ui553Ok" alt="" width="324"><figcaption></figcaption></figure>

### 5-2.動的なメンションを付けてメッセージ投稿してみる

トリガーのリクエストペイロードに\[mention\_id]と\[action]を追加します。

トリガーの下にアクション、\[if]を追加します。

ifは以下の通り設定します。 データは変数から\[action]を選択、状態は\[等しい]を選択、値は\[search]と入力します。

ifの分岐、Yesの方に\[ユーザー一覧を取得]と\[レスポンス]を移動させます。

※これによりactionがsearchだったら、Slackのユーザー一覧から、idを取得し、自社アプリにidを保存するという動きを取れるようになります。

次にifのステップから\[else]をクリックし、Noだった時の動きを設定します。

\[メッセージを投稿]と\[レスポンス]をelseの配下に移動させます。

\[メッセージを投稿]のステップのメッセージ内容を変数の\[mention\_id]に変更します。

<figure><img src="/files/ZvlD989aYXRAZJdJtzxB" alt="" width="375"><figcaption></figcaption></figure>

※これによりactionがsearch以外だったら、slackにメッセージを投稿する(searchで取得したidを活用した)動きを取れるようになります。

テストに成功すればSlackのユーザー一覧をアプリに保存し、アプリからSlackにメンション付きでメッセージを送信するソリューションの完成です。

### 追記：ソリューションを複製しておく

今回の中級編STEP2で作成したソリューションをStep3で活用しますので、ソリューションを複製しておきましょう。

[ソリューション一覧](https://embed.anyflow.jp/solutions)から、今回作成したソリューションの複製を行ってください。

***

## **まとめ**

今回のセクションでは、RequestトリガーのResponseを活用するソリューションの作り方を学ぶことができました。

リクエストペイロードに、if/elseの分岐を組み合わせることで、1つのソリューション内でSlackのユーザー一覧取得とメンション付きメッセージ投稿を使い分けることができました。また、レスポンスペイロードを設定することで、取得したユーザーIDをアプリ側に返す仕組みも実現できました。

STEP3では、異なるコミュニケーションツールのソリューションを作り、Slackとの違いを見ていきましょう。

***

## **ネクストステップ**

次は、Teamsのソリューションを作成する方法をご紹介します。

[STEP3 | スキーマの共通化](/trial-tour/start-intermediate/step3)

にお進みください。


# STEP3 | スキーマの共通化

## **概要**

STEP2ではSlackにおけるユーザー一覧取得とメンション付きのメッセージ投稿のソリューションを作成しました。

STEP3では、同じコミュニケーションツールであるTeamsでも同じようにソリューションを作成し、違いを体感してみましょう。

***

## **1. スキーマの共通化について理解する**

STEP3でお伝えしたいことを先にご紹介します。こちらを理解いただければSTEP3を実際に試す必要はありません。

Slackでユーザー一覧を取得しメンション付きのメッセージを送る際にレスポンスで受け取ったデータは、ユーザーIDとメールアドレスでした。

ユーザーIDは同じSlackでもTeamsでも`id` という同じ名称でデータを保持しています。

しかし、メールアドレスはSlackでは`email`、Teamsでは`mail`と異なる名称でデータを保持しています。

また、名前（表示名）に至ってはそれぞれのアプリケーションが、複数のデータを異なる名称で持っています。

<table><thead><tr><th width="159.83203125">データ項目</th><th width="231.9765625">Slack</th><th>Teams</th><th>共通化スキーマ</th></tr></thead><tbody><tr><td>ユーザーID</td><td>id</td><td>id</td><td>idに共通化</td></tr><tr><td>メールアドレス</td><td>email</td><td>mail</td><td>emailに共通化</td></tr><tr><td>名前（表示名）</td><td>name、real_name、display_name、first_name、last_name、real_name_normalized、display_name_normalized</td><td>displayName、surname、givenName</td><td>nameに共通化</td></tr></tbody></table>

このように同じ「ユーザー情報」でもアプリケーションによってフィールド名が異なります。\
アプリごとに異なるデータ構造に対応する開発は、以下の理由で大変です：

* 各アプリのAPI仕様を個別に学習する必要がある
* データ取得ロジックをアプリごとに実装する必要がある
* 新しいアプリを追加するたびに実装コストがかかる

### Request\&Responseトリガーによるデータの正規化

Request\&Responseトリガーのレスポンスペイロード機能を使うと、異なるアプリケーションから取得したデータを統一された形式に変換して返すことができます。

**具体的な実装例**

Slackの場合（入力）

```
{
 "id": "U12345",
 "email": "user@example.com",
 "real_name": "John Doe"
}
```

Teamsの場合（入力）

```
{
 "id": "29:12345",
 "mail": "user@example.com",
 "displayName": "John Doe"
}
```

Response Stepのペイロード設定（統一形式）

```
{    "id": "$=payload.id=$",    
　　　"email": "$=payload.email=$",  // Slackの場合
     "email": "$=payload.mail=$",   // Teamsの場合
     "name": "$=payload.real_name=$",  // Slackの場合
     "name": "$=payload.displayName=$" // Teamsの場合
}
```

最終的なレスポンス（どちらのアプリでも同じ形式）

```
{
 "id": "...",
 "email": "user@example.com",
 "name": "John Doe"
}
```

### メリット

* 統一されたインターフェース：呼び出し元はどのアプリからデータが来たかを意識する必要がない
* 開発効率の向上：データを使用する側の実装を1つで済ませられる
* 保守性の向上：新しいアプリを追加する場合、Response Stepのマッピングを追加するだけで済む
* テストの簡素化：統一された形式でテストできるため、テストケースがシンプルになる

Request\&Responseトリガーのレスポンスペイロード機能は、異なるアプリケーションのデータ構造の違いを吸収する「アダプター層」として機能します。これにより、アプリケーションごとの実装の違いを隠蔽し、統一されたインターフェースを提供できるため、開発効率と保守性が向上します。

***

## **2.実際にTeamsでのソリューションを作成する**

Teamsにはチームとチャネルという概念があります。\
チームに所属しているユーザーは複数のチャネルを作成してそれぞれでチャットができます。

このチームとチャネルという概念はSTEP2で使用したSlackにはありません。\
そこで、エンドユーザーを追加して、ウィザードを設定しましょう。

まず、中級STEP2で作成したソリューションを複製したものを開き、ウィザード画面を開いてください。

### **2-1. エンドユーザー変数を設定する**

変数のウィンドウから\[エンドユーザー変数]をクリックします。

追加ボタンを押して、\[チームID]と\[チャネルID]を追加します。※型は`String`です。

すでにあるチャンネルは削除してください。

<figure><img src="/files/6W5teXFuZMsWc4Y9Re1r" alt="" width="347"><figcaption></figcaption></figure>

### **2-2. ウィザードを設定する**

SlackBotの認証は使わないため、ウィザードから解除します。

<figure><img src="/files/ZpsyoIw1H9cJvDoXOF76" alt="" width="563"><figcaption></figcaption></figure>

左下にあるエンドユーザーの設定項目からMicrosoft Teamsをスクリーン1に割り当ててください。

同様にチームIDとチャネルIDもスクリーン1に割り当ててください。

<figure><img src="/files/ybBmck5WwivhYgiYdnzu" alt="" width="563"><figcaption></figcaption></figure>

チームIDを選択し、設定を下記に変更してください。

* 入力方法：\[アシスト]
* アシストを選択：\[チーム一覧]

チャネルIDを選択し、設定を下記に変更してください。

* 入力方法：\[アシスト]
* アシストを選択：\[チームのチャネル一覧]
* 参照フィールド：\[チームID]

### 2-3.メンバー一覧を取得する

ソリューション画面に戻ります。

ステップ3に\[+]ボタンから\[アクション]を選択し\[Microsoft Teams]を選択します。

* カスタムアクションを選択します。

<figure><img src="/files/miuMSOYDED3ZcAdcAtWW" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}

### カスタムアクションについて

Helpをご確認の上、下記をご覧ください。
{% endhint %}

* カスタムアクション名：任意の名前を付けます。
* HTTPメソッド：`GET`を選択します。
* リクエストパス：`users`と入力します。
* レスポンスタイプ：`json`を選択します。
* レスポンス定義：JSONまたは手動で追加します。下記を参考に追加してください。

{% tabs %}
{% tab title="{}JSONで追加" %}

```
{
  "value": [  
    {
      "id": "1",  
      "mail": "test@anyflow.co.jp"  
    }
  ]
}
```

{% endtab %}

{% tab title="手動追加" %}

* 名前「value」、型「Array」で、追加します。
* 名前「element」、型「Object」で、任意項目にするにチェックを入れて追加します。
* 名前「id」、型「String」で、任意項目にするにチェックを入れて追加します。
* 名前「mail」、型「String」で、任意項目にするにチェックを入れて追加します。
* elementをvalueの配下に移動します。同様にidとemailをelement配下に移動させます。
  {% endtab %}
  {% endtabs %}

<figure><img src="/files/xujT0KYBv7HWIwvzzKRI" alt=""><figcaption></figcaption></figure>

ステップ4に\[レスポンス]を追加します。

* 実行ステータス：`成功にする`を選択します。
* レスポンス名：任意の名前を付けます。
* レスポンスペイロードは以下のように設定します。
  * リストソース：変数のStep3にある`value` を選択します。
  * id：変数のStep3にある`id` を選択します。
  * email：変数のStep3にある`mail` を選択します。

### 2-4.Teamsにメッセージを送信する

ステップ2の\[if]から\[else]を設定すると、ステップ5に配置されます。

ステップ6にアクションから\[Teams]を選択し、\[チャネルにメッセージを送信]を選択します。

* チームID：変数からエンドユーザー変数の\[チームID]を選択します。
* チャネルID：変数からエンドユーザー変数の\[チャネルID]を選択します。
* メッセージ本文は下記のように設定します。
  * コンテンツタイプ：\[HTML形式]を選択します。
  * メッセージ内容：変数からStep1の\[message]を選択します。
* メンションは下記のように設定します。
  * ユーザーID：変数からStep1の\[mention\_id]を選択します。

ステップ7に\[レスポンス]を選択します。

* レンポンス名：\[ok]を選択します。
* ペイロード：任意のレスポンスを設定します。今回は\[ok]と入力します。

### **2-5. ソリューションをテストする**

完成したので、テストしましょう。ソリューションの仕組みはSTEP2と同様です。searchでユーザー一覧を取得し、取得したidに対して、メンション付きのメッセージを送信する。という流れです。

テストに成功したら、終了です。

***

## **まとめ**

今回のセクションでは、スキーマの共通化について学ぶことができました。

中級編はこれにて完了です。お疲れ様でした。

次はいよいよ実際に本番に向けてソリューションを構築していきましょう。

### 👉**いよいよ、本番向けソリューションの構築へ**

[トライアルツアーが終わったら](/trial-tour/after-trial-tour)


# Copy of トライアルツアー中級編

Anyflow Embed を使いこなす

## **概要**

初級のトライアルツアー、お疲れ様でした！！\
Anyflow Embedの基本的な仕組みは理解できたでしょうか。\
中級のトライアルツアーでは少しレベルを上げて、自社プロダクトと連携するためのステップをご紹介します。

自社プロダクトに公開可能なAPIが用意されている場合はそれを使いながら学ぶことができます。\
用意されていない場合でも、サンプルで実行できるAPIをご紹介しますので安心して取り組んでください。

## **トライアルツアー中級編の流れ**

### [**STEP1｜独自のアクションを追加する**](/trial-tour/start-intermediate/step1)

HTTPコネクタを使って独自のアクションを実行する方法についてご案内します。

### [**STEP2｜My Event を理解する**](/trial-tour/start-intermediate/step2)

My Eventの仕組みについて、デモツールを使いながらご案内します。

### [**STEP3｜My Event を実装する**](broken://pages/fLJ6hztesbIez12mquE4)

My Eventを使って独自のトリガーを追加する方法についてご案内します。

まずは、[STEP1｜独自のアクションを追加する](/trial-tour/start-intermediate/step1)にて基本的な操作をマスターしましょう！


# STEP1 | 独自のアクションを追加する

## **概要**

初級トライアルツアーで作成したソリューションをさらにアップデートさせていきましょう。

目指すべきゴールを端的に示すと以下の通りです。

<table><thead><tr><th width="111.6640625">種類</th><th width="239.7109375">Before</th><th>After</th></tr></thead><tbody><tr><td>トリガー</td><td>Google Drive<br>（ファイル/フォルダが作成された際に実行）</td><td>同様</td></tr><tr><td>アクション</td><td>Slack Bot<br>（ファイル名を投稿）</td><td><strong>HTTP（独自アクションの追加）</strong><br>&#x26;<br>Slack Bot（独自アクションのレスポンスを投稿）</td></tr></tbody></table>

***

## **0.中級用の準備を行う**

中級用のツアーを始める準備を行います。

[ソリューション一覧](https://embed.anyflow.jp/solutions)から、初級STEP4で作成したソリューションの複製を行います。

<figure><img src="https://files.readme.io/5e0dc82-image.png" alt=""><figcaption></figcaption></figure>

コピーが完了するとソリューションエディタが開きます。

<figure><img src="https://files.readme.io/df0a4f1-image.png" alt=""><figcaption></figcaption></figure>

ソリューションの名称は中級用の名前に変更しておきましょう。

Slackのアクションを2ステップ目に移動させます。

<figure><img src="https://files.readme.io/183e859-image.png" alt="" width="563"><figcaption></figcaption></figure>

ifのステップは今回は利用しないため削除します。

<figure><img src="https://files.readme.io/02fce7a-image.png" alt="" width="563"><figcaption></figcaption></figure>

***

## **1.HTTPコネクタを設定する**

独自アクションを追加するには[HTTPコネクタ](/solution-editor/actions/api-call/http)を利用します。

HTTPコネクタは任意のAPIを実行できるため、自社のコネクタがAnyflow Embedに登録されていなくても自社のAPIを呼び出すことができます。

### **1-1. このツアーで利用するAPIについて**

今回の中級トライアルツアーでは、HTTPコネクタでリクエストするAPIとして、Anyflowがデモ用に作成したAPIを利用します。

[\[デモ用\] 名刺画像からリード情報を読取るAPI - Anyflow Demo](https://wm5j7sd60b.apidog.io/)

<figure><img src="https://files.readme.io/90dacbf-image.png" alt=""><figcaption></figcaption></figure>

このAPIは架空の名刺管理ツールのAPIとして作成しており、名刺画像を受け取って、そこに含まれるリード情報を解析し返却するような挙動をします。

※返却される値はランダムな値であり、実際に名刺画像を読み取った結果ではありません。

あくまでも例として挙げているため、自社のAPIが利用可能な場合はそちらを使ってツアーを進めていただくことも可能です。

### **1-2. HTTPコネクタを追加する**

1ステップ目と2ステップ目の間で「ステップを追加」し、アクションとして「HTTP」を追加します。

<figure><img src="https://files.readme.io/7844057-image.png" alt=""><figcaption></figcaption></figure>

表示名は任意です。今回は`名刺読み取りAPI`としておきます。

<figure><img src="https://files.readme.io/a2585fe-image.png" alt=""><figcaption></figcaption></figure>

### **1-3. リクエストヘッダーを設定する**

[デモ用のAPI仕様書o](https://wm5j7sd60b.apidog.io/)を確認しながら設定を行います。

HTTPメソッドは`POST`を選択します。

<figure><img src="https://files.readme.io/dc8ef3f-image.png" alt=""><figcaption></figcaption></figure>

認証用のTokenをエンドユーザーから入力してもらうために、エンドユーザー変数を作成しておきます。ウィザードへの配置も忘れずに行ってください。

<figure><img src="https://files.readme.io/116bca6-image.png" alt="" width="563"><figcaption></figcaption></figure>

POSTを選択するとさらに設定項目が表示されますので、以下の内容を設定します。

<table><thead><tr><th width="254.40234375">項目</th><th>設定</th></tr></thead><tbody><tr><td>リクエストURI</td><td><a href="https://mock.apidog.com/m1/459105-0-default/api/v1/extract-business-card">https://mock.apidog.com/m1/459105-0-default/api/v1/extract-business-card</a></td></tr><tr><td>リクエストURLパラメータキー</td><td>設定不要</td></tr><tr><td>リクエストヘッダーキー</td><td></td></tr><tr><td>┗ Content-Type</td><td>application/json</td></tr><tr><td>┗ Authorization</td><td>Bearer {Token}<br>※Bearerと{Token}の間には半角スペースを入れてください</td></tr><tr><td>リクエストタイプ</td><td>json</td></tr></tbody></table>

<figure><img src="https://files.readme.io/72c6418-image.png" alt=""><figcaption></figcaption></figure>

### **1-4. リクエストボディを設定する**

リクエストボディの入力方法は`デフォルト`にします。

リクエストボディ定義は、「JSONで追加」を選択します。

<figure><img src="https://files.readme.io/94e04cf-image.png" alt=""><figcaption></figcaption></figure>

JSONを入力するモーダルが表示されるので、以下のJSONをコピーして貼り付けます。

＜JSON＞

```json
{
    "file_name": "business-card.png",
    "file_content": "iVBORw0KGgoAAAANSUhEUgAAATYAAACjCAMAAAA3vs..."
}
```

<figure><img src="https://files.readme.io/cccdacb-_2024-04-24_20.31.56.png" alt="" width="563"><figcaption></figcaption></figure>

「生成する」を押すとリクエストボディの定義が自動で生成されます。

<figure><img src="https://files.readme.io/e373ffc-image.png" alt=""><figcaption></figcaption></figure>

リクエストボディには、Google Driveトリガーで取得した値を設定します。

file\_name : `Name`

file\_content：`b64encode(File contents)` ※[Formula](/solution-editor/common-specs/formula)を使って記述します

<figure><img src="https://files.readme.io/855b5a6-image.png" alt=""><figcaption></figcaption></figure>

### **1-5. レスポンスの設定を行う**

リクエスト側と同じ要領で、レスポンス側も設定を行います。

レスポンスヘッダー定義：設定不要

レスポンスタイプ：`json`

レスポンスボディ定義：以下のJSONを追加します。

```json
{
    "status": "success",
    "code": 200,
    "message": "名刺データを読み取りました。",
    "data": {
        "id": 1,
        "company": "株式会社AAA",
        "department": "開発部",
        "name": "田中 太郎",
        "email": "[email protected]"
    }
}
```

<figure><img src="https://files.readme.io/efff69b-image.png" alt="" width="563"><figcaption></figcaption></figure>

***

## **2.レスポンスをSlackで投稿する**

HTTPで取得したレスポンスをSlackで投稿します。

例として、レスポンスの`{data}`に含まれる要素を一通り追加しています。

<figure><img src="https://files.readme.io/41a5744-image.png" alt=""><figcaption></figcaption></figure>

***

## **3.テスト実行する**

今回のAPI仕様を踏まえると、ソリューションが成功するためには以下が必要になります。

1. ウィザードのToken欄に正しいトークン（`anyflowtesttoken`）が入力されていること

   <figure><img src="https://files.readme.io/cb68906-image.png" alt=""><figcaption></figcaption></figure>
2. Google Drive にアップロードされたファイルが画像ファイル（`png/jpeg`）であること

これを踏まえて、成功パターンと失敗パターンのテスト実行を行います。

### **3-1.成功することの確認**

ウィザードのToken欄に`anyflowtesttoken`を入力します。

Google Driveには画像ファイル（`.png/.jpeg`）をアップロードします。

Slackに以下の様なメッセージが投稿されていれば成功です。

<figure><img src="https://files.readme.io/35b496c-image.png" alt="" width="375"><figcaption></figcaption></figure>

### **3-2.失敗することの確認**

以下どちらかを実施します

* ウィザードのToken欄に正しくないトークン文字列（例：`invalidtoken`）を入力する
* Google Driveに画像ファイル以外のファイル（例：`.txt`）をアップロードする

いずれもSlackにはメッセージが投稿されず、ソリューションが失敗になっているはずです。

<figure><img src="https://files.readme.io/7954215-image.png" alt="正しくないトークンを入力した場合"><figcaption><p>正しくないトークンを入力した場合</p></figcaption></figure>

<figure><img src="https://files.readme.io/0cb2e6c-image.png" alt="画像ファイル以外をアップロードした場合"><figcaption><p>画像ファイル以外をアップロードした場合</p></figcaption></figure>

***

## **4.エラーに対応する**

上記の様に、様々な理由でソリューションはエラーになり得ます。

Anyflow Embedではそれぞれのケースに対応する機能を持っています。（詳細は[こちら](/ops/solution-error)）

今回は

* エラー監視ステップの導入
* Google Drive トリガーへの条件付与

によりエラーへの対応を追加します。

### **4-1.エラー監視ステップの導入**

ステップ1と2の間に「エラー」ステップを追加します。

<figure><img src="https://files.readme.io/ebb03cb-image.png" alt=""><figcaption></figcaption></figure>

「エラー監視」と「エラーならば」のステップが追加されるので、エラー監視の内側にHTTPとSlackのステップを移動します。

<figure><img src="https://files.readme.io/fbaf4b0-image.png" alt=""><figcaption></figcaption></figure>

「エラーならば」の内側に、新たにSlackコネクタを配置し、エラー時のメッセージを設定します。

Anyflow EmbedのSDKが設置されている画面のURLを添えておくと、[ソリューション実行履歴](/ops/solution-history)からエンドユーザー自身でエラー内容を確認することができます。

```
// 例
エラーが発生しています。
以下のURLから内容を確認してください。
https://your-product.com/integration/
```

<figure><img src="https://files.readme.io/38eab85-image.png" alt=""><figcaption></figcaption></figure>

これによりエラーが発生した際に「エラーならば」の内側のステップが実行され、Slackメッセージが送られますが、ソリューションの結果としては「成功」のステータスになってしまいます。

これを「失敗」のステータスにするために、[停止ステップ](/solution-editor/logic/stop)を追加します。

停止ステップを使うとソリューションを強制的に停止させ、実行ステータスを「成功」「失敗」のどちらかに固定することができます。

「エラーならば」の内側で停止ステップを追加します。

<figure><img src="https://files.readme.io/b7714f4-image.png" alt=""><figcaption></figcaption></figure>

実行ステータスは「失敗にする」を選択します。

<figure><img src="https://files.readme.io/7db99f2-image.png" alt=""><figcaption></figcaption></figure>

改めてテストを行います。

ウィザードのToken欄には、正しくないトークン文字列（例：`invalidtoken`）を入力します。

ステータスが「失敗」になっていて、Slackにエラー通知が発生していれば完了です🎉

<figure><img src="https://files.readme.io/dc4561e-image.png" alt="テスト結果のステータスが「失敗」になっている" width="600"><figcaption><p>テスト結果のステータスが「失敗」になっている</p></figcaption></figure>

<figure><img src="https://files.readme.io/daf3f8a-image.png" alt="Slackにエラーの投稿がされている" width="400"><figcaption><p>Slackにエラーの投稿がされている</p></figcaption></figure>

今回の場合、エンドユーザーがGoogle Driveを日常的に使うなかで、画像以外のファイルをUPしてしまうことは容易に考えられます。

その度に毎回通知が飛ぶのはユーザー体験を損ねるため、処理を修正します。

ステップ1を選択し「トリガー条件」を開きます。

<figure><img src="https://files.readme.io/716a2e0-image.png" alt=""><figcaption></figcaption></figure>

条件を満たす場合のみトリガーを有効化できるため、2つの条件を設定します。

**if　Mime type　等しい　image/png**

<figure><img src="https://files.readme.io/fb2112a-image.png" alt="" width="563"><figcaption></figcaption></figure>

**OR　Mime type　等しい　image/jpeg**

<figure><img src="https://files.readme.io/00f3176-image.png" alt="" width="563"><figcaption></figcaption></figure>

改めてテストを行います。

Google Driveに画像ファイル以外のファイル（例：`.txt`）をアップロードします。

<figure><img src="https://files.readme.io/d7f4d6a-image.png" alt=""><figcaption></figcaption></figure>

`.txt`ファイルをUPしたにもかかわらずトリガーの待機状態が維持されており、

`.png/.jpeg`ファイルをUPした場合にトリガーの待機状態が解除されていたら、完了です🎉

***

## **まとめ**

中級編 STEP1 お疲れ様でした。

今回のセクションでは、HTTPコネクタやエラーへの対応について学ぶことができました。

HTTPコネクタを使うと`独自のアクション`を組み込んだソリューションを作成することができます。

今回はデモ用API での紹介でしたので、ぜひ実際のAPIでも試してみてください。

初級編と比べてボリュームも増えていますので、不明点があればAnyflow CSチームにご連絡ください。

***

## **ネクストステップ**

次は、`独自のトリガー`を組み込む方法をご紹介します。

[STEP2 | My Event を理解する](/trial-tour/start-intermediate/step2)

にお進みください。


# STEP2 | My Event を理解する

## **概要**

中級STEP1では独自の`アクション`をソリューションに組み込む方法を学びました。

中級STEP2では独自の`トリガー`をソリューションに組み込む方法として、[**My Event**](/solution-editor/triggers/outgoing/my-event)を紹介します。

<figure><img src="https://files.readme.io/f548499-image.png" alt=""><figcaption></figcaption></figure>

My Event を使用すると、自社プロダクトで発生した任意のイベントをもとに Anyflow のソリューションを実行することができます。

My Event を使用したソリューションを実行するまでの流れ：

1. **管理画面で My Event を作成し、ソリューションのトリガーに使用する**
2. **自社プロダクトから、My Event のエンドポイントにAPIリクエストを送信する**
3. **My Event をトリガーにしたソリューションが実行される**

このセクションでは、あらかじめ準備されたデモ環境を用いて、上記の流れを簡単に体験していただきます。

***

## **0.デモ用ツールにログインする**

事前準備として[Anyflow-demo ウィザードホスティング](https://anyflow-demo.integrations.jp/)にログインします。

ログインできない場合はカスタマーサクセス担当者までご連絡ください。

{% hint style="success" %}

### ウィザードホスティングとは

Anyflowが用意したドメインにある、SDKを実装済のサイトです。\
詳しくは[こちら](/release/wizard-hosting)をご確認ください。
{% endhint %}

***

## **1.My Event の作成〜トリガー使用**

実際にMy Event を設定しトリガーに指定する方法は、STEP3で紹介します。

今回はあらかじめ設定済のスクリーンショットをご確認ください。

左メニューから「My Event」を選択すると、設定済のMy Event の一覧が表示されます。

<figure><img src="https://files.readme.io/2821c4b-image.png" alt=""><figcaption></figcaption></figure>

My Event には、任意のイベント名（キー）とスキーマを定義できます。

スキーマを使うことで、My Event の実行時に自社プロダクトから送信したいデータを含めることができます。

<figure><img src="https://files.readme.io/ee91b7f-image.png" alt=""><figcaption></figcaption></figure>

作成したMy Event は、ソリューションエディタにてトリガーとして使用することができます。

今回は、STEP1で作成したソリューションのトリガーを Google Drive から My Event に変更しています。

<figure><img src="https://files.readme.io/edafed4-image.png" alt=""><figcaption></figcaption></figure>

このようにして作成されたソリューションが、[Anyflow-demo ウィザードホスティング](https://anyflow-demo.integrations.jp/)にデプロイされています。

エンドユーザーとして体験するために「連携する」をクリックします。

<figure><img src="https://files.readme.io/2abe19d-image.png" alt=""><figcaption></figcaption></figure>

***

## **2.My Event のAPIリクエスト**

ウィザードホスティングを利用して My Event をテスト実行する場合、以下の手順により簡単にアクセストークンを取得することができます。

[アクセストークンの発行 - ウィザードホスティングの場合](/solution-editor/triggers/outgoing/my-event/access-token)

アクセストークンを取得したら、以下のリクエストを行うことで、設定済のMy Eventである `file_uploaded` を実行します。

”<アクセストークン>”の部分は先程取得したアクセストークンの値に置き換えてください。

```json
curl https://for-product-api.anyflow.jp/sdk/send_my_event \
  --request POST \
  --header "Authorization: Bearer <アクセストークン>" \
  --header "Content-Type: application/json" \
  --data '{
    "key": "file_uploaded",
    "payload": {
        "file_name": "business-card.png",
        "file_content": "iVBORw0KGgoAAAANSUhEUgAAATYAAACjCAMAAAA3vs...",
    }
  }'
```

{% hint style="success" %}

### ヒント

cURLの実行が不安な場合でも、PostmanなどのAPI実行ツールにペーストするとスムーズに実行できます。

[Import cURL commands - Postman Leaning Center](https://learning.postman.com/docs/getting-started/importing-and-exporting/importing-curl-commands/)
{% endhint %}

アクセストークンの有効期限は発行してから**10分間**のため、スムーズに行いましょう。

（期限が切れてしまった場合は、再度ウィザードホスティングから取得します。）

***

## **3.My Event によるソリューション実行**

今回は、STEP1で作成したソリューションのトリガーを Google Drive から My Event に変更しています。

つまり、トリガーを変更してもSTEP1と同様のメッセージが得られれば成功となります。

<figure><img src="https://files.readme.io/e34353e-image.png" alt=""><figcaption></figcaption></figure>

以下のようなメッセージがSlackで投稿されたら成功です 🎉

<figure><img src="https://files.readme.io/c10d704-image.png" alt="" width="375"><figcaption></figcaption></figure>

## **まとめ**

今回のセクションでは、My Event の仕組みについて学ぶことができました。

My Event を使うと`独自のトリガー`を組み込んだソリューションを作成することができます。

今回はデモ環境を用いての簡易的な紹介でしたが、STEP3では実際に自身の環境で試していきましょう。

***

## **ネクストステップ**

次は、自身の環境でMy Event を実装する方法をご紹介します。

[STEP3 | My Event を実装する](broken://pages/fLJ6hztesbIez12mquE4)

にお進みください。


# STEP3 | My Event を実装する

## **概要**

STEP2ではMy Event の仕組みについて、デモ環境を使って学びました。

STEP3では、実際に自身の環境でMy Event を実装していきましょう。

{% hint style="warning" %}

### コード実装が必要な内容です

JWTの発行や[SDKの組み込み](/anyflow-sdk/docs)などの内容が登場するため、コードの実装を行うことができる開発者の方とともに進めてください。
{% endhint %}

## **1.My Event を作成する**

My Event の作成は [My Event 一覧画面](https://embed.anyflow.jp/my-events) から行います。

<figure><img src="https://files.readme.io/2d7a5b2-image.png" alt=""><figcaption></figcaption></figure>

今回は「画像がアップロードされた時」というイベントを作成します。

名前：画像がアップロードされた時

キー：`image_uploaded`

スキーマ：

{% code title="JSON" %}

```
{
    "file_name": "business-card.png",
    "file_content": "iVBORw0KGgoAAAANSUhEUgAAATYAAACjCAMAAAA3vs..."
}
```

{% endcode %}

<figure><img src="https://files.readme.io/6f6f607-image.png" alt=""><figcaption></figcaption></figure>

***

## **2. My Event をソリューションに適用する**

[連携ソリューション一覧](https://embed.anyflow.jp/solutions) に移動し、STEP1で作成したソリューションを開きます。

### **2-1. トリガーをMy Eventに変更する**

Google Driveトリガーを My Event に変更します。

<figure><img src="https://files.readme.io/fc45e11-image.png" alt=""><figcaption></figcaption></figure>

My Event の設定で「画像がアップロードされた時（image\_uploaded）」を選択します。

<figure><img src="https://files.readme.io/307303d-image.png" alt="" width="563"><figcaption></figcaption></figure>

### **2-2. HTTPコネクタの設定を変更する**

トリガーが変更されたことで、HTTPコネクタの設定を変更する必要があるため、修正していきます。

リクエストボディに指定する値を、Google Drive の値からMy Event の値に変更します。

* file\_name：My Event の file\_name
* file\_content：My Event の file\_content

<figure><img src="https://files.readme.io/485dab4-image.png" alt=""><figcaption></figcaption></figure>

### **2-3. ウィザードからGoogle Driveを解除する**

Google Driveの認証は使わないため、ウィザードから解除します。

<figure><img src="https://files.readme.io/27bb074-image.png" alt=""><figcaption></figcaption></figure>

***

### **2-4. ソリューションをテストする**

管理画面にて My Event を利用したソリューションをテストする場合、擬似的にMy Event が実行された扱いとなり、My Event のAPI をリクエストしなくてもテストが動きます。

My Event のペイロードで渡される値は、My Event 作成時に入力したサンプル値となります。

<figure><img src="https://files.readme.io/8b2bd81-image.png" alt=""><figcaption></figcaption></figure>

これまでと同様にSlackメッセージが投稿されれば、ソリューションの設定は完了です。

<figure><img src="https://files.readme.io/e48e8cd-image.png" alt="" width="375"><figcaption></figcaption></figure>

次のステップで必要となるため、ソリューションのデプロイを行います。

保存ボタンの隣にある矢印からデプロイを選択します。

<figure><img src="https://files.readme.io/7378f26-image.png" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}

### ヒント

ここでデプロイしたソリューションは、次のステップを実装しない限りエンドユーザーは利用できません。
{% endhint %}

***

## **3. ソリューションを提供する**

実際にMy Event のAPI をリクエストする形でソリューションを実行していきます。

作成したソリューションを[エンドユーザー向けの環境で提供する](/release/how-to-delivery)必要があります。

方法は二通りありますが、今回はSDKを用いる方法について説明していきます。

### **3-1. JWTを発行する**

STEP2ではデモ環境を使ったため、JWTの発行はスキップされました。

今回はスキップできないため、自身の環境で処理を作成してください。

事前にAnyflow CS とやり取りが必要な部分があります。

**手順**

1. [SDKを埋め込むサイトのオリジン（URL）をAnyflow CS に共有する](/release/embed/generate-jwt#jwtwosuruni)
2. [署名を行うための鍵ペアを生成し、公開鍵を管理画面から登録する](/release/embed/generate-jwt#jwtwosuru)
3. [iss（ベンダーID）の値を管理画面から取得する](/release/embed/generate-jwt#peirdono)
4. [指定されたJWTの仕様に基づき、JWTを発行する](/release/embed/generate-jwt#sanpurukdo)

### **3-2. SDKを実装する**

こちらの[SDKドキュメント](https://docs-embed.anyflow.jp/anyflow-sdk/docs)を参考に進めていきます。

**手順**

1. SDKをインストールする
2. JWTを使ってSDKを初期化、SDKインスタンスを取得する
3. 今回作成したソリューションのIDを取得する
4. 取得したIDを使ってウィザードを読み込む

ウィザードが開き、以下の様な画面が表示されれば成功です🎉

エンドユーザーとして認証を行えば、My Event を受け取る準備ができました。

<figure><img src="https://files.readme.io/6fc8337-image.png" alt="" width="375"><figcaption></figcaption></figure>

***

## **4. My Event を実行する**

STEP2と同様に進めていきます。

1. [アクセストークンの発行](/solution-editor/triggers/outgoing/my-event/access-token)

   “”の部分をJWT（signature）の値に置き換えてリクエストを行います

   ```json
   curl --location --request POST 'https://for-product-api.anyflow.jp/sdk/token' \
   --header 'Content-Type: application/json' \
   --data-raw '{
       "jwt":"<Your JWT>",
       "env": null
   }'
   ```
2. [My Event の API 実行](/solution-editor/triggers/outgoing/my-event#my-event-endopointonirikuesutowosuru)

   ”<アクセストークン>”の部分は先程取得したアクセストークンの値に置き換えてください。

   ```json
   curl https://for-product-api.anyflow.jp/sdk/send_my_event \
     --request POST \
     --header "Authorization: Bearer <アクセストークン>" \
     --header "Content-Type: application/json" \
     --data '{
       "key": "image_uploaded",
       "payload": {
           "file_name": "business-card.png",
           "file_content": "iVBORw0KGgoAAAANSUhEUgAAATYAAACjCAMAAAA3vs..."
       }
     }'
   ```

   上記のcurlコマンドは My Event の詳細画面からも取得できます。

<figure><img src="https://files.readme.io/13d3877-image.png" alt=""><figcaption></figcaption></figure>

これまでと同様にSlackメッセージが投稿されれば成功です🎉

<figure><img src="https://files.readme.io/61071a4-image.png" alt="" width="375"><figcaption></figcaption></figure>

***

## **TIPS : トークン入力を省く方法**

今回はソリューションの中で架空の名刺サービスAPIを利用しています。

この認証では、エンドユーザーが初回の認証時にウィザードでTokenの値を入力する必要があります。

<figure><img src="https://files.readme.io/209c4c4-image.png" alt="" width="563"><figcaption></figcaption></figure>

しかし、もしこのAPIが自社プロダクトのAPIの場合、自社プロダクトにログインしているエンドユーザーが、再度自社プロダクトの認証を行うのは手間に感じるかもしれません。

この場合、Tokenの値をエンドユーザー変数で取得するのではなく、My Event のペイロードに含めてしまえば、エンドユーザーの入力は不要になります。

<figure><img src="https://files.readme.io/abea818-image.png" alt=""><figcaption></figcaption></figure>

My Event は自社プロダクトの内部処理からリクエストできるため、tokenの存在をエンドユーザーが意識することなくソリューションを実行することが可能です。

***

## **まとめ**

今回のセクションでは、My Event やSDKの実装について学ぶことができました。

STEP1の通り、HTTPコネクタを使えば独自のアクションを実現でき、

STEP2\~3の通り、My Eventを使えば独自のトリガーを実現できます。

これらを活用してさらに自由度の高いソリューション作成を進めていきましょう！！

### 👉**いよいよ、本番向けソリューションの構築へ**

[トライアルツアーが終わったら](/trial-tour/after-trial-tour)


# トライアルツアーが終わったら

トライアルツアーの初級編・中級編が終わったら、実際に本番で利用するためのソリューションを作成していきましょう。

このページではそのためのステップをご紹介します。

## **1.ゴールを決める**

<figure><img src="https://files.readme.io/4228697-A_small_team_of_three_to_four_professionals_is_seated_around_a_smaller_round_table_in_a_cozy_meeting_room_engaged_in_an_intense_discussion_about_set.webp" alt="" width="563"><figcaption></figcaption></figure>

**現在の課題から、Anyflow Embedで実現したいことを決める**\
課題を洗い出し、Anyflow Embedを利用してどう解決できるか、導入のゴールを関係者間で確認しましょう。\
課題の優先度とすり合わせたゴールをもとに、Anyflow Embedでどんな内容を実現したいか検討してください。

技術的内容については、以下のページを案内しておくとスムーズです。

[Anyflow SDKを使った組み込み](/release/embed)

[Anyflow SDK ドキュメント](/anyflow-sdk/docs)

## **2.設定する**

<figure><img src="https://files.readme.io/d83c937-Reimagine_the_first_image_with_a_joyful_twist__An_individual_is_seated_at_a_modern_minimalist_desk_in_a_brightly_lit_office_now_with_a_more_relaxed_.webp" alt="" width="563"><figcaption></figcaption></figure>

**各機能の使い方を学び、設定を行う**\
Anyflow Embedの仕組みや仕様を確認しながら、設定を進めましょう。\
トライアルツアーでご案内している順番に従って進めるのがおすすめです。

[🎨 ソリューションエディタの機能](/solution-editor/about)

## **3.テストする**

<figure><img src="https://files.readme.io/b01c428-Visualize_a_scene_where_two_engineers_are_collaboratively_analyzing_a_no-code_tool_interface_displayed_on_a_single_computer_screen_in_a_tech-focused_w.webp" alt="" width="563"><figcaption></figcaption></figure>

**テストデータを準備し、実際にAnyflow Embedを動かしてみる**\
実際のテストデータを準備して、ソリューションが動作するか確認しましょう。

[テストを行う](/release/solution-test)

## **4.稼働準備〜運用する**

<figure><img src="https://files.readme.io/17415de-Imagine_a_relaxed_and_casual_setting_where_a_team_is_presenting_a_new_website_feature_now_with_the_team_members_dressed_in_more_casual_attire_reflec.webp" alt="" width="563"><figcaption></figcaption></figure>

**実際の運用に向けて準備を進める**\
ソリューションの提供準備が整ったら、エンドユーザー向けにご案内する準備をはじめます。

[デプロイを行う](/release/deploy)

[ソリューションを提供する](/ops/solution-history)

## **その他**

不明な点はお気軽にAnyflow CSチームにご連絡ください👋


# CRM


# SalesforceのToDoデータを取得する

SalesforceからToDoデータを取得する方法について

{% hint style="success" %}
このレシピについて

このレシピは、[Task | Salesforce プラットフォームのオブジェクトリファレンス | Salesforce Developers](https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_task.htm) を参考に記述されています。
{% endhint %}

## **Salesforceの「ToDoデータ」とは**

Salesforce 上で管理される、通話などのToDo項目をはじめとしたビジネス活動のデータです。

データ構造の詳細は、[Task | Salesforce プラットフォームのオブジェクトリファレンス | Salesforce Developers](https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_task.htm) で確認可能です。

## **Anyflow Embedで取得する**

Anyflow Embed で Salesforce のToDoデータを取得する手順を紹介します。

Salesforce のToDoデータを**スプレッドシートに一括追加する**というシンプルなソリューションを作成し、ToDoに含まれるデータを把握します。

また、本レシピではSalesforceアクションの「SOQL（WHERE句）を使用してレコードを検索」を利用します。

<figure><img src="https://files.readme.io/c716b49-CleanShot_2024-03-31_at_19.59.412x.png" alt=""><figcaption></figcaption></figure>

### **1.Clickトリガーを設定する**

Clickトリガーを設定します。

<figure><img src="https://files.readme.io/b9650b7-image.png" alt=""><figcaption></figcaption></figure>

### **2.Salesforceの「SOQL（WHERE句）を使用してレコードを検索」アクションを設定する**

Salesforceコネクタを追加します。

<figure><img src="https://files.readme.io/7915c2e-.png" alt=""><figcaption></figcaption></figure>

「SOQL（WHERE句）を使用してレコードを検索」アクションを選択します。

<figure><img src="https://files.readme.io/27c9aec-CleanShot_2024-03-31_at_19.45.562x.png" alt=""><figcaption></figcaption></figure>

以下の通りに設定を行います。取得したToDoデータを `CreatedDate` （作成日時）の昇順で取得します。

| 設定項目名        | 設定値             |
| ------------ | --------------- |
| オブジェクト       | 標準オブジェクト / ToDo |
| SOQL WHERE句  | ※ 設定不要          |
| 取得対象のフィールド   | ※ 設定不要          |
| ソート（基準フィールド） | CreatedDate     |
| ソート（並び順）     | 昇順              |
| オフセット        | ※ 設定不要          |

### **3.スプレッドシートの列名を設定する**

スプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | 1行追加          |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

「ヘッダーの列名」は以下の通りに設定します。

```
Id
Subject
OwnerId
Status
Priority
```

「行データ」にも同じ様に設定します。

<figure><img src="https://files.readme.io/4e8b58b-CleanShot_2024-03-31_at_19.52.222x.png" alt="" width="563"><figcaption></figcaption></figure>

### **4.スプレッドシートに一括追記する**

続けてもう1つスプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | 行を一括追加        |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

<figure><img src="https://files.readme.io/677257c-_2024-02-26_17.45.08.png" alt=""><figcaption></figcaption></figure>

「ヘッダーの列名」は以下の通りに設定します。

```
Id
Subject
OwnerId
Status
Priority
```

「リストソース」は以下の通りに設定します。

<figure><img src="https://files.readme.io/75e0da8-CleanShot_2024-03-31_at_19.53.282x.png" alt=""><figcaption></figcaption></figure>

「要素フィールド」は以下の通りに設定します。

<figure><img src="https://files.readme.io/fc46d7c-CleanShot_2024-03-31_at_19.54.352x.png" alt=""><figcaption></figcaption></figure>

各要素の入力フィールドは「直接入力」ではなく「Formula」を選択します。 Formula の詳細な利用方法については [Formula](/solution-editor/common-specs/formula)で確認可能です。

<figure><img src="https://files.readme.io/a2d29fb-CleanShot_2024-03-31_at_19.56.002x.png" alt="" width="563"><figcaption></figcaption></figure>

### **5.ウィザードを設定する**

必要な認証をウィザードに追加します。

### **6.テストを行う**

テストを行うと、スプレッドシートにデータが追加されていることがわかります。


# Salesforceの取引先データを取得する

Salesforceから取引先データを取得する方法について

{% hint style="success" %}

### このレシピについて

このレシピは、[Account | Salesforce プラットフォームのオブジェクトリファレンス | Salesforce Developers](https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_account.htm) を参考に記述されています。
{% endhint %}

## **Salesforceの「取引先データ」とは**

Salesforce 上で管理される、個々の取引先（顧客、競合会社、およびパートナーなどのビジネスに関係する組織や個人）のデータです。

データ構造の詳細は、[Account | Salesforce プラットフォームのオブジェクトリファレンス | Salesforce Developers](https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_account.htm) で確認可能です。

## **Anyflow Embedで取得する**

Anyflow Embed で Salesforce の取引先データを取得する手順を紹介します。

Salesforce の取引先データを**スプレッドシートに一括追加する**というシンプルなソリューションを作成し、取引先に含まれるデータを把握します。

また、本レシピではSalesforceアクションの「SOQL（WHERE句）を使用してレコードを検索」を利用します。

<figure><img src="https://files.readme.io/7774832-CleanShot_2024-04-06_at_11.10.002x.png" alt=""><figcaption></figcaption></figure>

### **1.Clickトリガーを設定する**

Clickトリガーを設定します。

<figure><img src="https://files.readme.io/b9650b7-image.png" alt=""><figcaption></figcaption></figure>

### **2.Salesforceの「SOQL（WHERE句）を使用してレコードを検索」アクションを設定する**

Salesforceコネクタを追加します。

<figure><img src="https://files.readme.io/7915c2e-.png" alt=""><figcaption></figcaption></figure>

「SOQL（WHERE句）を使用してレコードを検索」アクションを選択します。

<figure><img src="https://files.readme.io/27c9aec-CleanShot_2024-03-31_at_19.45.562x.png" alt=""><figcaption></figcaption></figure>

以下の通りに設定を行います。取得した取引先データを `CreatedDate` （作成日時）の昇順で取得します。

| 設定項目名        | 設定値            |
| ------------ | -------------- |
| オブジェクト       | 標準オブジェクト / 取引先 |
| SOQL WHERE句  | ※ 設定不要         |
| 取得対象のフィールド   | ※ 設定不要         |
| ソート（基準フィールド） | `CreatedDate`  |
| ソート（並び順）     | 昇順             |
| オフセット        | ※ 設定不要         |

### **3.スプレッドシートの列名を設定する**

スプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | 1行追加          |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

「ヘッダーの列名」は以下の通りに設定します。

```
Id
Name
Type
Phone
Website
```

「行データ」にも同じ様に設定します。

<figure><img src="https://files.readme.io/e5b2a3f-CleanShot_2024-04-06_at_11.18.352x.png" alt="" width="563"><figcaption></figcaption></figure>

### **4.スプレッドシートに一括追記する**

続けてもう1つスプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | 行を一括追加        |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

<figure><img src="https://files.readme.io/677257c-_2024-02-26_17.45.08.png" alt=""><figcaption></figcaption></figure>

「ヘッダーの列名」は以下の通りに設定します。

```
Id
Name
Type
Phone
Website
```

「リストソース」は以下の通りに設定します。

<figure><img src="https://files.readme.io/75e0da8-CleanShot_2024-03-31_at_19.53.282x.png" alt=""><figcaption></figcaption></figure>

「要素フィールド」は以下の通りに設定します。

<figure><img src="https://files.readme.io/5b141a6-CleanShot_2024-04-06_at_11.20.002x.png" alt=""><figcaption></figcaption></figure>

各要素の入力フィールドは「直接入力」ではなく「Formula」を選択します。 Formula の詳細な利用方法については [Formula](/solution-editor/common-specs/formula)で確認可能です。

<figure><img src="https://files.readme.io/a51a598-CleanShot_2024-04-06_at_11.21.132x.png" alt="" width="563"><figcaption></figcaption></figure>

### **5.ウィザードを設定する**

必要な認証をウィザードに追加します。

### **6.テストを行う**

テストを行うと、スプレッドシートにデータが追加されていることがわかります。


# Salesforceの取引先データを登録する

Salesforceから取引先データを登録する方法について

{% hint style="success" %}

### このレシピについて

このレシピは、[Account | Salesforce プラットフォームのオブジェクトリファレンス | Salesforce Developers](https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_account.htm) を参考に記述されています。
{% endhint %}

## **Salesforceの「取引先データ」とは**

Salesforce 上で管理される、個々の取引先（顧客、競合会社、およびパートナーなどのビジネスに関係する組織や個人）のデータです。

データ構造の詳細は、[Account | Salesforce プラットフォームのオブジェクトリファレンス | Salesforce Developers](https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_account.htm) で確認可能です。

## **Anyflow Embedで登録する**

Anyflow Embed で Salesforce の取引先データを登録する（書き込みする）手順を紹介します。

スプレッドシートにある取引先のデータを**Salesforce の取引先オブジェクトに登録する**というシンプルなソリューションを作成し、スプレッドシートに入力された取引先データを定期的に確認し、Salesforce の取引先オブジェクトして登録する方法を理解します。

<figure><img src="https://files.readme.io/93d2e3b-CleanShot_2024-06-15_at_11.57.042x.png" alt=""><figcaption></figcaption></figure>

### **1.Google Sheets トリガーを設定する**

Google Sheets トリガーをコネクタを追加します。

<figure><img src="https://files.readme.io/96e8c80-image.png" alt="" width="563"><figcaption></figcaption></figure>

「シートに新しい行が追加された際に実行」を選択します。

<figure><img src="https://files.readme.io/4d11acd-CleanShot_2024-06-15_at_13.39.332x.png" alt="" width="563"><figcaption></figcaption></figure>

以下の通りに設定を行います。「取得開始位置（行番号）」には、スプレッドシートの1行目には列名を記載するため、次の行である `2` を入力します。「ポーリング間隔」は任意の値を設定可能ですが、動作確認を容易にするために最も短い間隔である「5分」を選択します。

| 設定項目名       | 設定値           |
| ----------- | ------------- |
| スプレッドシートID  | 任意のスプレッドシートID |
| シートID       | 任意のシートID      |
| 取得開始位置（行番号） | `2`           |
| ポーリング間隔     | 5分            |
| トリガー条件      | ※ 設定不要        |

<figure><img src="https://files.readme.io/677257c-_2024-02-26_17.45.08.png" alt=""><figcaption></figcaption></figure>

「ヘッダーの列名（改行区切り）」には以下の内容を設定します。

```
名前
電話番号
ウェブサイト
```

### **2.Salesforceの「レコードを作成」アクションを設定する**

Salesforceコネクタを追加します。

<figure><img src="https://files.readme.io/7915c2e-.png" alt=""><figcaption></figcaption></figure>

「レコードを作成」アクションを選択します。

<figure><img src="https://files.readme.io/1181ec3-CleanShot_2024-06-15_at_13.53.402x.png" alt="" width="563"><figcaption></figcaption></figure>

「オブジェクト」には `Account`と入力します。Account はSalesforceにおいて取引先を表すオブジェクトです。

<figure><img src="https://files.readme.io/edda45c-CleanShot_2024-06-15_at_13.54.572x.png" alt="" width="563"><figcaption></figcaption></figure>

フィールドを以下のように設定します。

&#x20;&#x20;

<figure><img src="https://files.readme.io/81e3c05-CleanShot_2024-06-15_at_14.20.392x.png" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="https://files.readme.io/7653ebb-CleanShot_2024-06-15_at_14.20.032x.png" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="https://files.readme.io/fe3e133-CleanShot_2024-06-15_at_13.57.292x.png" alt="" width="563"><figcaption></figcaption></figure>

### **3.スプレッドシートに取引先データを入力する**

スプレッドシートを開き、1行目には列名を、2行目からは実際にSalesforceに登録する取引先データを入力します。

<figure><img src="https://files.readme.io/a3c3ac9-image.png" alt="" width="563"><figcaption></figcaption></figure>

### **4.ウィザードを設定する**

必要な認証をウィザードに追加します。

### **5.テストを行う**

テストを実行します。しばらく時間が経つと、スプレッドシートに入力したデータが処理され、Salesforceに取引先データが登録されていることがわかります。


# Salesforceの商談を取得する

Salesforceから商談データを取得する方法について

{% hint style="success" %}

### このレシピについて

このレシピは、[Opportunity | Salesforce プラットフォームのオブジェクトリファレンス | Salesforce Developers](https://developer.salesforce.com/docs/atlas.ja-jp.248.0.object_reference.meta/object_reference/sforce_api_objects_opportunity.htm) を参考に記述されています。
{% endhint %}

## **Salesforceの「商談」とは**

Salesforce 上で管理される、販売または保留中の取引である商談を表すデータです。

データ構造の詳細は、[Opportunity | Salesforce プラットフォームのオブジェクトリファレンス | Salesforce Developers](https://developer.salesforce.com/docs/atlas.ja-jp.248.0.object_reference.meta/object_reference/sforce_api_objects_opportunity.htm) で確認可能です。

## **Anyflow Embedで取得する**

Anyflow Embed で Salesforce の商談データを取得する手順を紹介します。

Salesforce の商談データを**スプレッドシートに一括追加する**というシンプルなソリューションを作成し、商談に含まれるデータを把握します。

また、本レシピではSalesforceアクションの「SOQL（WHERE句）を使用してレコードを検索」を利用します。

<figure><img src="https://files.readme.io/3d0a338d7432e693d0ec5e5da911e3cce46d008b902032305aba566c7fc2aa81-image.png" alt=""><figcaption></figcaption></figure>

### **1.Clickトリガーを設定する**

Clickトリガーを設定します。

<figure><img src="https://files.readme.io/b9650b7-image.png" alt=""><figcaption></figcaption></figure>

### **2.Salesforceの「SOQL（WHERE句）を使用してレコードを検索」アクションを設定する**

Salesforceコネクタを追加します。

<figure><img src="https://files.readme.io/7915c2e-.png" alt=""><figcaption></figcaption></figure>

「SOQL（WHERE句）を使用してレコードを検索」アクションを選択します。

<figure><img src="https://files.readme.io/27c9aec-CleanShot_2024-03-31_at_19.45.562x.png" alt=""><figcaption></figcaption></figure>

以下の通りに設定を行います。取得した取引先データを `CreatedDate` （作成日時）の昇順で取得します。

| 設定項目名        | 設定値           |
| ------------ | ------------- |
| オブジェクト       | 標準オブジェクト / 商談 |
| SOQL WHERE句  | ※ 設定不要        |
| 取得対象のフィールド   | ※ 設定不要        |
| ソート（基準フィールド） | `CreatedDate` |
| ソート（並び順）     | 昇順            |
| オフセット        | ※ 設定不要        |

### **3.スプレッドシートの列名を設定する**

スプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | 1行追加          |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

「ヘッダーの列名」は以下の通りに設定します。

```
Id
Name
StageName
CloseDate
Amount
```

「行データ」にも同じ様に設定します。

<figure><img src="https://files.readme.io/cfa28c129722b716756806b676293c4a2a33fbb84575fcbb2b782d09791ec699-image.png" alt="" width="563"><figcaption></figcaption></figure>

### **4.スプレッドシートに一括追記する**

続けてもう1つスプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | 行を一括追加        |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

<figure><img src="https://files.readme.io/677257c-_2024-02-26_17.45.08.png" alt=""><figcaption></figcaption></figure>

「ヘッダーの列名」は以下の通りに設定します。

```
Id
Name
StageName
CloseDate
Amount
```

「リストソース」は以下の通りに設定します。

<figure><img src="https://files.readme.io/75e0da8-CleanShot_2024-03-31_at_19.53.282x.png" alt=""><figcaption></figcaption></figure>

「要素フィールド」は以下の通りに設定します。

<figure><img src="https://files.readme.io/316a294e60b866b948b708cd6205c9e64e1874d68b125289df3040a4bdeb2fd9-image.png" alt=""><figcaption></figcaption></figure>

各要素の入力フィールドは「直接入力」ではなく「Formula」を選択します。 Formula の詳細な利用方法については Formulaで確認可能です。

<figure><img src="https://files.readme.io/a51a598-CleanShot_2024-04-06_at_11.21.132x.png" alt="" width="563"><figcaption></figcaption></figure>

### **5.ウィザードを設定する**

必要な認証をウィザードに追加します。

### **6.テストを行う**

テストを行うと、スプレッドシートにデータが追加されていることがわかります。


# Salesforceのリードを取得する

Salesforceから取引先データを取得する方法について

{% hint style="success" %}

### このレシピについて

このレシピは、[Account | Salesforce プラットフォームのオブジェクトリファレンス | Salesforce Developers](https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_lead.htm) を参考に記述されています。
{% endhint %}

## **Salesforceの「リード」とは**

Salesforce 上で管理される、見込み客やリードを表すデータです。

データ構造の詳細は、[Account | Salesforce プラットフォームのオブジェクトリファレンス | Salesforce Developers](https://developer.salesforce.com/docs/atlas.ja-jp.object_reference.meta/object_reference/sforce_api_objects_lead.htm) で確認可能です。

## **Anyflow Embedで取得する**

Anyflow Embed で Salesforce のリードデータを取得する手順を紹介します。

Salesforce のリードデータを**スプレッドシートに一括追加する**というシンプルなソリューションを作成し、取引先に含まれるデータを把握します。

また、本レシピではSalesforceアクションの「SOQL（WHERE句）を使用してレコードを検索」を利用します。

### **1.Clickトリガーを設定する**

Clickトリガーを設定します。

<figure><img src="https://files.readme.io/b9650b7-image.png" alt=""><figcaption></figcaption></figure>

### **2. Salesforceの「SOQL（WHERE句）を使用してレコードを検索」アクションを設定する**

Salesforceコネクタを追加します。

<figure><img src="https://files.readme.io/7915c2e-.png" alt=""><figcaption></figcaption></figure>

「SOQL（WHERE句）を使用してレコードを検索」アクションを選択します。

<figure><img src="https://files.readme.io/27c9aec-CleanShot_2024-03-31_at_19.45.562x.png" alt=""><figcaption></figcaption></figure>

以下の通りに設定を行います。取得した取引先データを `CreatedDate` （作成日時）の昇順で取得します。

| 設定項目名        | 設定値            |
| ------------ | -------------- |
| オブジェクト       | 標準オブジェクト / リード |
| SOQL WHERE句  | ※ 設定不要         |
| 取得対象のフィールド   | ※ 設定不要         |
| ソート（基準フィールド） | `CreatedDate`  |
| ソート（並び順）     | 昇順             |
| オフセット        | ※ 設定不要         |

### **3.スプレッドシートの列名を設定する**

スプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | 1行追加          |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

「ヘッダーの列名」は以下の通りに設定します。

```
Id
Name
Type
Phone
Website
```

「行データ」にも同じ様に設定します。

<figure><img src="https://files.readme.io/e5b2a3f-CleanShot_2024-04-06_at_11.18.352x.png" alt="" width="563"><figcaption></figcaption></figure>

### **4.スプレッドシートに一括追記する**

続けてもう1つスプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | 行を一括追加        |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

<figure><img src="https://files.readme.io/677257c-_2024-02-26_17.45.08.png" alt=""><figcaption></figcaption></figure>

「ヘッダーの列名」は以下の通りに設定します。

```
Id
Name
Type
Phone
Website
```

「リストソース」は以下の通りに設定します。

<figure><img src="https://files.readme.io/75e0da8-CleanShot_2024-03-31_at_19.53.282x.png" alt=""><figcaption></figcaption></figure>

「要素フィールド」は以下の通りに設定します。

<figure><img src="https://files.readme.io/5b141a6-CleanShot_2024-04-06_at_11.20.002x.png" alt=""><figcaption></figcaption></figure>

各要素の入力フィールドは「直接入力」ではなく「Formula」を選択します。 Formula の詳細な利用方法については Formulaで確認可能です。

<figure><img src="https://files.readme.io/a51a598-CleanShot_2024-04-06_at_11.21.132x.png" alt="" width="563"><figcaption></figcaption></figure>

### **5.ウィザードを設定する**

必要な認証をウィザードに追加します。

### **6.テストを行う**

テストを行うと、スプレッドシートにデータが追加されていることがわかります。


# HubSpotのコンタクトデータを取得する

HubSpotからコンタクトデータを取得する方法について

{% hint style="success" %}

### このレシピについて

このレシピは、[CRM API | コンタクト](https://developers.hubspot.jp/docs/api/crm/contacts) を参考に記述されています。
{% endhint %}

## **HubSpotの「コンタクトデータ」とは**

HubSpot に登録された、自社とやり取りする個人に関する情報です。\
（参考：[CRM API | コンタクト](https://developers.hubspot.jp/docs/api/crm/contacts)）

HubSpot の CRM API を利用することで、HubSpot に登録された**コンタクトデータ**の一覧を取得できます。

### **HubSpotの「コンタクトデータ」の構造**

```json
{
  "id": "1",
  "properties": {
    "createdate": "2022-11-11T02:53:00.214Z",
    "email": "[email protected]",
    "firstname": "Maria",
    "hs_object_id": "1",
    "lastmodifieddate": "2023-01-31T04:40:28.639Z",
    "lastname": "Johnson (Sample Contact)"
  },
  "createdAt": "2022-11-11T02:53:00.214Z",
  "updatedAt": "2023-01-31T04:40:28.639Z",
  "archived": false
}
```

## **Anyflow Embedで取得する**

Anyflow Embed で HubSpot のコンタクトデータを取得する手順を紹介します。

HubSpot のコンタクトデータを**スプレッドシートに一括追加する**というシンプルなソリューションを作成し、コンタクトに含まれるデータを把握します。

<figure><img src="https://files.readme.io/0540a15-CleanShot_2024-05-03_at_16.19.172x.png" alt=""><figcaption></figcaption></figure>

### **1.Clickトリガーを設定する**

Clickトリガーを設定します。

<figure><img src="https://files.readme.io/b9650b7-image.png" alt=""><figcaption></figcaption></figure>

### **2.HubSpot コネクタを設定する**

HubSpot コネクタを追加します。

<figure><img src="https://files.readme.io/c1e1552-CleanShot_2024-04-13_at_11.12.372x.png" alt=""><figcaption></figcaption></figure>

### **jison3.HubSpot のカスタムアクションを設定する**

ソリューションエディタに戻り、HubSpotコネクタを以下の通りに設定します。

<table><thead><tr><th width="328.97265625">設定項目名</th><th>設定値</th></tr></thead><tbody><tr><td>カスタムアクション名</td><td>データを取得する</td></tr><tr><td>HTTPメソッド</td><td>GET</td></tr><tr><td>リクエストパス</td><td>/crm/v3/objects/contacts</td></tr><tr><td>リクエストヘッダー</td><td>※ 設定不要</td></tr><tr><td>リクエストタイプ</td><td>※ 設定不要</td></tr><tr><td>レスポンスヘッダー定義</td><td>※ 設定不要</td></tr><tr><td>レスポンスタイプ</td><td>json</td></tr></tbody></table>

また、「レスポンスボディ定義」には以下の設定を行います。

```json
{
  "results": [
    {
      "id": "string",
      "properties": {
        "email": "string",
        "firstname": "string",
        "lastname": "string"
      },
      "createdAt": "2024-04-15T00:14:10.990Z"
    }
  ]
}
```

「element」の名前は「contact」に変更しておきます。

<figure><img src="https://files.readme.io/ced85ad-image.png" alt="" width="563"><figcaption></figcaption></figure>

以下が設定後のイメージです。

<figure><img src="https://files.readme.io/3526584-CleanShot_2024-05-03_at_16.22.042x.png" alt="" width="563"><figcaption></figcaption></figure>

### **4.スプレッドシートの列名を設定する**

スプレッドシートコネクタを追加し、以下の通りに設定を行います。

<table><thead><tr><th width="290.51171875">設定項目名</th><th>設定値</th></tr></thead><tbody><tr><td>アクション</td><td>1行追加</td></tr><tr><td>スプレッドシートID</td><td>任意のスプレッドシートID</td></tr><tr><td>シートID</td><td>任意のシートID</td></tr></tbody></table>

<figure><img src="https://files.readme.io/677257c-_2024-02-26_17.45.08.png" alt=""><figcaption></figcaption></figure>

「ヘッダーの列名」は以下の通りに設定します。

```
id
email
firstname
lastname
createdAt
```

「行データ」にも同じ様に設定します。

<figure><img src="https://files.readme.io/46fc07e-CleanShot_2024-05-03_at_16.22.392x.png" alt="" width="563"><figcaption></figcaption></figure>

### **5.スプレッドシートに一括追記する**

スプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | 行を一括追加        |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

「ヘッダーの列名」は以下の通りに設定します。

```
id
email
firstname
lastname
createdAt
```

「リストソース」は以下の通りに設定します。

<figure><img src="https://files.readme.io/75d7fd3-CleanShot_2024-05-03_at_16.23.572x.png" alt=""><figcaption></figcaption></figure>

「要素フィールド」は以下の通りに設定します。（「i番目のcontacts」から項目を選択します。）

<figure><img src="https://files.readme.io/312cd07-CleanShot_2024-05-03_at_16.24.542x.png" alt=""><figcaption></figcaption></figure>

### **6.ウィザードを設定する**

必要な認証をウィザードに追加します。

### **7.テストを行う**

テストを行うと、スプレッドシートにデータが追加されていることがわかります。


# HubSpotの会社データを取得する

HubSpotから会社データを取得する方法について

{% hint style="success" %}

### このレシピについて

このレシピは、[CRM API | 会社](https://developers.hubspot.jp/docs/api/crm/companies) を参考に記述されています。
{% endhint %}

## **HubSpotの「会社データ」とは**

HubSpot に登録された、自社とやり取りする組織に関する情報です。\
（参考：[CRM API | 会社](https://developers.hubspot.jp/docs/api/crm/companies)）

HubSpot の CRM API を利用することで、HubSpot に登録された**会社データ**の一覧を取得できます。

### **HubSpotの「会社データ」の構造**

```json
{
  "paging": {
    "next": {
      "link": "?after=NTI1Cg%3D%3D",
      "after": "NTI1Cg%3D%3D"
    }
  },
  "results": [
    {
      "associations": {
        "additionalProp1": {
          "paging": {
            "next": null,
            "prev": {
              "before": "string",
              "link": "string"
            }
          },
          "results": [
            {
              "id": "string",
              "type": "string"
            }
          ]
        },
        "additionalProp2": {
          "paging": {
            "next": null,
            "prev": {
              "before": "string",
              "link": "string"
            }
          },
          "results": [
            {
              "id": "string",
              "type": "string"
            }
          ]
        },
        "additionalProp3": {
          "paging": {
            "next": null,
            "prev": {
              "before": "string",
              "link": "string"
            }
          },
          "results": [
            {
              "id": "string",
              "type": "string"
            }
          ]
        }
      },
      "createdAt": "2024-04-15T01:19:55.574Z",
      "archived": true,
      "archivedAt": "2024-04-15T01:19:55.574Z",
      "propertiesWithHistory": {
        "additionalProp1": [
          {
            "sourceId": "string",
            "sourceType": "string",
            "sourceLabel": "string",
            "updatedByUserId": 0,
            "value": "string",
            "timestamp": "2024-04-15T01:19:55.574Z"
          }
        ],
        "additionalProp2": [
          {
            "sourceId": "string",
            "sourceType": "string",
            "sourceLabel": "string",
            "updatedByUserId": 0,
            "value": "string",
            "timestamp": "2024-04-15T01:19:55.574Z"
          }
        ],
        "additionalProp3": [
          {
            "sourceId": "string",
            "sourceType": "string",
            "sourceLabel": "string",
            "updatedByUserId": 0,
            "value": "string",
            "timestamp": "2024-04-15T01:19:55.574Z"
          }
        ]
      },
      "id": "string",
      "properties": {
        "additionalProp1": "string",
        "additionalProp2": "string",
        "additionalProp3": "string"
      },
      "updatedAt": "2024-04-15T01:19:55.574Z"
    }
  ]
}
```

## **Anyflow Embedで取得する**

Anyflow Embed で HubSpot の会社データを取得する手順を紹介します。

HubSpot の会社データを**スプレッドシートに一括追加する**というシンプルなソリューションを作成し、会社に含まれるデータを把握します。

<figure><img src="https://files.readme.io/63951b6-CleanShot_2024-04-13_at_11.11.242x.png" alt=""><figcaption></figcaption></figure>

### **1.Clickトリガーを設定する**

Clickトリガーを設定します。

<figure><img src="https://files.readme.io/b9650b7-image.png" alt=""><figcaption></figcaption></figure>

### **2.HubSpot コネクタを設定する**

HubSpot コネクタを追加します。

<figure><img src="https://files.readme.io/c1e1552-CleanShot_2024-04-13_at_11.12.372x.png" alt="" width="563"><figcaption></figcaption></figure>

### **3.HubSpot のカスタムアクションを設定する**

ソリューションエディタに戻り、freee人事労務コネクタを以下の通りに設定します。

<table><thead><tr><th width="298.42578125">設定項目名</th><th>設定値</th></tr></thead><tbody><tr><td>カスタムアクション名</td><td>会社データを取得する</td></tr><tr><td>HTTPメソッド</td><td>GET</td></tr><tr><td>リクエストパス</td><td>/crm/v3/objects/companies</td></tr><tr><td>リクエストヘッダー</td><td>※ 設定不要</td></tr><tr><td>リクエストタイプ</td><td>※ 設定不要</td></tr><tr><td>レスポンスヘッダー定義</td><td>※ 設定不要</td></tr><tr><td>レスポンスタイプ</td><td>json</td></tr></tbody></table>

また、「レスポンスボディ定義」には「JSONを追加」で以下を設定します。

```json
{
  "results": [
    {
      "id": "string",
      "properties": {
        "name": "string",
        "domain": "string"
      },
      "createdAt": "2024-04-15T00:14:10.990Z",
      "updatedAt": "2024-04-15T00:14:10.990Z"
    }
  ]
}
```

「element」の名前は「company」に変更しておきます。

<figure><img src="https://files.readme.io/ced85ad-image.png" alt="" width="563"><figcaption></figcaption></figure>

以下が設定後のイメージです。

<figure><img src="https://files.readme.io/0964a55-CleanShot_2024-04-13_at_11.15.232x.png" alt="" width="563"><figcaption></figcaption></figure>

### **4.スプレッドシートの列名を設定する**

スプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | 1行追加          |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

<figure><img src="https://files.readme.io/677257c-_2024-02-26_17.45.08.png" alt=""><figcaption></figcaption></figure>

「ヘッダーの列名」は以下の通りに設定します。

```
id
name
domain
createdAt
updatedAt
```

「行データ」にも同じ様に設定します。

<figure><img src="https://files.readme.io/e368655-CleanShot_2024-04-13_at_11.16.172x.png" alt="" width="563"><figcaption></figcaption></figure>

### **5.スプレッドシートに一括追記する**

スプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | 行を一括追加        |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

「ヘッダーの列名」は以下の通りに設定します。

```
id
name
domain
createdAt
updatedAt
```

「リストソース」は以下の通りに設定します。

<figure><img src="https://files.readme.io/5ec1755-CleanShot_2024-04-13_at_11.17.182x.png" alt=""><figcaption></figcaption></figure>

「要素フィールド」は以下の通りに設定します。（「i番目のcompany」から項目を選択します。）

<figure><img src="https://files.readme.io/08bd454-CleanShot_2024-04-13_at_11.18.142x.png" alt=""><figcaption></figcaption></figure>

### **6.ウィザードを設定する**

必要な認証をウィザードに追加します。

### **7.テストを行う**

テストを行うと、スプレッドシートにデータが追加されていることがわかります。


# HubSpotの取引データを取得する

HubSpotから取引データを取得する方法について

{% hint style="success" %}

### このレシピについて

このレシピは、[CRM API | 取引](https://developers.hubspot.jp/docs/api/crm/deals) を参考に記述されています。
{% endhint %}

## **HubSpotの「取引データ」とは**

HubSpot に登録された、コンタクトまたは会社との間で進めている商取引を表す情報です。\
（参考：[CRM API | 取引](https://developers.hubspot.jp/docs/api/crm/deals)）

HubSpot の CRM API を利用することで、HubSpot に登録された**取引データ**の一覧を取得できます。

### **HubSpotの「取引データ」の構造**

```json
{
  "paging": {
    "next": {
      "link": "?after=NTI1Cg%3D%3D",
      "after": "NTI1Cg%3D%3D"
    }
  },
  "results": [
    {
      "associations": {
        "additionalProp1": {
          "paging": {
            "next": null,
            "prev": {
              "before": "string",
              "link": "string"
            }
          },
          "results": [
            {
              "id": "string",
              "type": "string"
            }
          ]
        },
        "additionalProp2": {
          "paging": {
            "next": null,
            "prev": {
              "before": "string",
              "link": "string"
            }
          },
          "results": [
            {
              "id": "string",
              "type": "string"
            }
          ]
        },
        "additionalProp3": {
          "paging": {
            "next": null,
            "prev": {
              "before": "string",
              "link": "string"
            }
          },
          "results": [
            {
              "id": "string",
              "type": "string"
            }
          ]
        }
      },
      "createdAt": "2024-04-15T01:21:49.107Z",
      "archived": true,
      "archivedAt": "2024-04-15T01:21:49.107Z",
      "propertiesWithHistory": {
        "additionalProp1": [
          {
            "sourceId": "string",
            "sourceType": "string",
            "sourceLabel": "string",
            "updatedByUserId": 0,
            "value": "string",
            "timestamp": "2024-04-15T01:21:49.107Z"
          }
        ],
        "additionalProp2": [
          {
            "sourceId": "string",
            "sourceType": "string",
            "sourceLabel": "string",
            "updatedByUserId": 0,
            "value": "string",
            "timestamp": "2024-04-15T01:21:49.107Z"
          }
        ],
        "additionalProp3": [
          {
            "sourceId": "string",
            "sourceType": "string",
            "sourceLabel": "string",
            "updatedByUserId": 0,
            "value": "string",
            "timestamp": "2024-04-15T01:21:49.107Z"
          }
        ]
      },
      "id": "string",
      "properties": {
        "additionalProp1": "string",
        "additionalProp2": "string",
        "additionalProp3": "string"
      },
      "updatedAt": "2024-04-15T01:21:49.107Z"
    }
  ]
}
```

## **Anyflow Embedで取得する**

Anyflow Embed で HubSpot の取引データを取得する手順を紹介します。

HubSpot の取引データを**スプレッドシートに一括追加する**というシンプルなソリューションを作成し、取引に含まれるデータを把握します。

<figure><img src="https://files.readme.io/9995be1-CleanShot_2024-04-13_at_11.33.052x.png" alt=""><figcaption></figcaption></figure>

### **1.Clickトリガーを設定する**

Clickトリガーを設定します。

<figure><img src="https://files.readme.io/b9650b7-image.png" alt=""><figcaption></figcaption></figure>

### **2.HubSpot コネクタを設定する**

HubSpot コネクタを追加します。

<figure><img src="https://files.readme.io/c1e1552-CleanShot_2024-04-13_at_11.12.372x.png" alt=""><figcaption></figcaption></figure>

### **3.HubSpot のカスタムアクションを設定する**

ソリューションエディタに戻り、freee人事労務コネクタを以下の通りに設定します。

| 設定項目名       | 設定値                   |
| ----------- | --------------------- |
| カスタムアクション名  | 取引データを取得する            |
| HTTPメソッド    | GET                   |
| リクエストパス     | /crm/v3/objects/deals |
| リクエストヘッダー   | ※ 設定不要                |
| リクエストタイプ    | ※ 設定不要                |
| レスポンスヘッダー定義 | ※ 設定不要                |
| レスポンスタイプ    | json                  |

また、「レスポンスボディ定義」には以下の設定を行います。

```json
{
  "results": [
    {
      "id": "string",
      "properties": {
        "dealname": "string",
        "amount": "string"
      },
      "createdAt": "2024-04-15T00:14:10.990Z",
      "updatedAt": "2024-04-15T00:14:10.990Z"
    }
  ]
}
```

「element」の名前は「deal」に変更しておきます。

<figure><img src="https://files.readme.io/ced85ad-image.png" alt="" width="563"><figcaption></figcaption></figure>

以下が設定後のイメージです。

<figure><img src="https://files.readme.io/8ba4cc1-CleanShot_2024-04-13_at_11.34.072x.png" alt="" width="563"><figcaption></figcaption></figure>

### **4. スプレッドシートの列名を設定する**

スプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | 1行追加          |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

<figure><img src="https://files.readme.io/677257c-_2024-02-26_17.45.08.png" alt=""><figcaption></figcaption></figure>

「ヘッダーの列名」は以下の通りに設定します。

```
id
dealname
amount
createdAt
updatedAt
```

「行データ」にも同じ様に設定します。

<figure><img src="https://files.readme.io/731f77d-CleanShot_2024-04-13_at_11.34.332x.png" alt="" width="563"><figcaption></figcaption></figure>

**スプレッドシートに一括追記する**

スプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | 行を一括追加        |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

「ヘッダーの列名」は以下の通りに設定します。

```
id
dealname
amount
createdAt
updatedAt
```

「リストソース」は以下の通りに設定します。

![](https://files.readme.io/e3725fe-CleanShot_2024-04-13_at_11.35.192x.png)

「要素フィールド」は以下の通りに設定します。（「i番目のdeals」から項目を選択します。）

![](https://files.readme.io/11f0f35-CleanShot_2024-04-13_at_11.36.152x.png)

必要な認証をウィザードに追加します。

テストを行うと、スプレッドシートにデータが追加されていることがわかります。

Updated 9 months ago

***

* [Table of Contents](broken://pages/U6ihqK3PT5EWJCP3NAP6)
* * [HubSpotの「取引データ」とは](broken://pages/U6ihqK3PT5EWJCP3NAP6)
    * [HubSpotの「取引データ」の構造](broken://pages/U6ihqK3PT5EWJCP3NAP6)
  * [Anyflow Embedで取得する](broken://pages/U6ihqK3PT5EWJCP3NAP6)
    * [1. Clickトリガーを設定する](broken://pages/U6ihqK3PT5EWJCP3NAP6)
    * [2. HubSpot コネクタを設定する](broken://pages/U6ihqK3PT5EWJCP3NAP6)
    * [3. HubSpot のカスタムアクションを設定する](broken://pages/U6ihqK3PT5EWJCP3NAP6)
    * [4. スプレッドシートの列名を設定する](broken://pages/U6ihqK3PT5EWJCP3NAP6)
    * [5. スプレッドシートに一括追記する](broken://pages/U6ihqK3PT5EWJCP3NAP6)
    * [6. ウィザードを設定する](broken://pages/U6ihqK3PT5EWJCP3NAP6)
    * [7. テストを行う](broken://pages/U6ihqK3PT5EWJCP3NAP6)


# コミュニケーション


# Slack チャンネルにファイルをアップロードする

## **概要**

SlackBot アクションで、Slack チャンネルにファイルをアップロードするカスタムアクションを構築します。

## **事前準備**

クラウドストレージサービスから、ファイルをダウンロードするアクションを追加します。本レシピでは [Box](https://app.box.com/folder/0) の「ファイルをダウンロード」アクションを利用する例を解説します。

<figure><img src="https://files.readme.io/4d7530e-CleanShot_2023-12-17_at_10.29.02.png" alt=""><figcaption></figcaption></figure>

アクションを追加し、アプリケーションとして「Box」を選択します。

<figure><img src="https://files.readme.io/0eb29da-CleanShot_2023-12-17_at_10.32.14.png" alt=""><figcaption></figcaption></figure>

アクションとして「ファイルをダウンロード」を選択します。

<figure><img src="https://files.readme.io/202b448-CleanShot_2023-12-17_at_10.33.20.png" alt=""><figcaption></figcaption></figure>

ダウンロードするファイルの ID を入力します。例として、常に同じファイルをダウンロードするよう、特定ファイルの ID を入力しています。

<figure><img src="https://files.readme.io/e1acfe7-CleanShot_2023-12-17_at_10.35.50.png" alt=""><figcaption></figcaption></figure>

## **構築手順**

先に構築した「ファイルをダウンロード」アクションによってダウンロードしたファイルを、Slack のチャンネルにアップロードするカスタムアクションを構築する手順を解説します。

<figure><img src="https://files.readme.io/b837ccd-CleanShot_2023-12-17_at_10.41.38.png" alt=""><figcaption></figcaption></figure>

アクションを追加し、アプリケーションとして「Slack Bot」を選択します。

<figure><img src="https://files.readme.io/084fa46-CleanShot_2023-12-17_at_10.41.31.png" alt=""><figcaption></figcaption></figure>

アクションとして「カスタムアクション」を選択します。

<figure><img src="https://files.readme.io/8cca71b-CleanShot_2023-12-17_at_10.46.19.png" alt=""><figcaption></figcaption></figure>

カスタムアクションを設定します。

「カスタムアクション名」にはわかりやすい任意の名前を入力します。

「HTTPメソッド」には `POST` を選択します。HTTPメソッドを選択すると、追加の入力フィールドが表示されます。

<figure><img src="https://files.readme.io/5ab0513-CleanShot_2023-12-17_at_10.47.26.png" alt=""><figcaption></figcaption></figure>

リクエストパスには `/files.upload` と入力します。

<figure><img src="https://files.readme.io/379402f-CleanShot_2023-12-17_at_10.51.18.png" alt=""><figcaption></figcaption></figure>

リクエストタイプには `multipart` と入力します。Slack の特定チャンネルにファイルをアップロードするにためには、この設定が必須となります。

<figure><img src="https://files.readme.io/af87ca2-CleanShot_2023-12-17_at_10.53.31.png" alt=""><figcaption></figcaption></figure>

リクエストボディ定義に、「手動追加」をクリックして `file` と `channel` ２つの項目を追加します。

<figure><img src="https://files.readme.io/548a3db-CleanShot_2023-12-17_at_10.55.33.png" alt=""><figcaption></figcaption></figure>

`file`スキーマは以下のように設定します。型には `File` を指定します。

<figure><img src="https://files.readme.io/6a61a9c-CleanShot_2023-12-23_at_11.16.25.png" alt=""><figcaption></figcaption></figure>

`channels`スキーマは以下のように設定します。型は `String` を指定します。

<figure><img src="https://files.readme.io/e124101-image.png" alt=""><figcaption></figcaption></figure>

リクエストボディの `file` で送信する値を設定します。

<figure><img src="https://files.readme.io/efb1e81-CleanShot_2023-12-23_at_11.37.10.png" alt=""><figcaption></figcaption></figure>

`Filename` に、Slack にファイルをアップロードしたあと、どようなファイル名でSlack に保存したいかを指定します。ここでは `cat` という名前を指定しています。

`Content` に、事前準備で作成した「ファイルをダウンロード」アクションによって提供される変数を指定します。`Content` をクリックし、変数欄から「ファイルをアップロード」→「ファイル」の順番に選択します。

`Content Type` は空白のままにします。

<figure><img src="https://files.readme.io/14fb3f3-CleanShot_2023-12-23_at_11.37.57.png" alt=""><figcaption></figcaption></figure>

リクエストボディの `channel` で送信する値を指定します。

`Content` にファイルをアップロードしたい Slack のチャンネル ID を入力します。

<figure><img src="https://files.readme.io/26bbb29-CleanShot_2023-12-23_at_11.39.05.png" alt=""><figcaption></figcaption></figure>

これで Slack にファイルをアップロードするカスタムアクションが完成したので、テストを実行してみましょう。

<figure><img src="https://files.readme.io/048c098-CleanShot_2023-12-23_at_11.46.22.png" alt=""><figcaption></figcaption></figure>

上記アクションをテスト実行すると、「ファイルをダウンロード」アクションでファイルがダウンロードされていることを確認できます。

<figure><img src="https://files.readme.io/2c73a51-CleanShot_2023-12-23_at_11.48.33.png" alt=""><figcaption></figcaption></figure>

また、Slack API から返された詳細な出力値を確認し、API コールが成功したかがどうか確認可能です。

<figure><img src="https://files.readme.io/cdbaced-CleanShot_2023-12-23_at_11.48.43.png" alt=""><figcaption></figcaption></figure>

Slack の指定したチャンネルにアクセスし、ファイルが正しくアップロードされているかについても確認しましょう。


# Slack チャンネルのメンバー情報一覧を取得する

## **概要**

SlackBot アクションでチャンネルに参加するメンバーの情報一覧を取得するカスタムアクションを構築します。

## **構築手順**

SlackBot アクションから「カスタムアクション」を選択します。

<figure><img src="https://files.readme.io/0368ae4-CustomAction3.png" alt="1439"><figcaption><p>SlackBot アクションのカスタムアクションを選択します</p></figcaption></figure>

選択したアクションに名前を付けます。\
今回は「メンバー一覧取得」というカスタムアクション名にします。\
この名前は、カスタムアクション名の下部分に表示されます。

<figure><img src="https://files.readme.io/802e146-CustomAction4.gif" alt="1439"><figcaption><p>カスタムアクション名を設定します</p></figcaption></figure>

呼び出す API のエンドポイントに基づいて、リクエストの HTTP メソッドを選択します。\
Slack API のドキュメントを確認すると、HTTP メソッドが記載されています。\
今回の場合、`conversations.members`がGET メソッドを使用することを示しています。

<figure><img src="https://files.readme.io/a938ace-CustomAction5.png" alt="1439"><figcaption><p>Slack APIドキュメント:conversations.members</p></figcaption></figure>

HTTP メソッドを選択すると、アクションに関連する入力フィールドが表示されます。

<figure><img src="https://files.readme.io/e4fadcb-CustomAction6.gif" alt="1437"><figcaption><p>HTTP メソッドを選択すると、追加の入力フィールドが表示されます</p></figcaption></figure>

リクエストパスには、`/conversations.members`と入力し、`https://slack.com/api/conversations.members`となるようにします。

<figure><img src="https://files.readme.io/69204ab-CustomAction7.png" alt="1437"><figcaption><p><code>conversations.members</code>のURL エンドポイントを追加します</p></figcaption></figure>

送信するリクエストを定義します。\
このAPIエンドポイントでは、`token`の他に`channel`をパラメーターとして渡す必要があります。

<figure><img src="https://files.readme.io/4d6587c-CustomAction8.png" alt="734"><figcaption><p>Slack API ドキュメント:conversations.membersのArguments</p></figcaption></figure>

{% hint style="success" %}

### token の扱いについて

カスタムアクションでは、認証トークン（例:ID）をあらかじめ付与した状態になります。
{% endhint %}

リクエスト URL パラメーターを設定します。

<figure><img src="https://files.readme.io/e8d0974-CustomAction10.gif" alt="1435"><figcaption><p>キーと値を入力します</p></figcaption></figure>

レスポンスタイプを選択します。\
選択後、レスポンスボディを定義する入力フィールドが表示されます。

<figure><img src="https://files.readme.io/45b6c7b-CustomAction11.gif" alt="1433"><figcaption><p>レスポンスタイプを選択すると、入力フィールドが表示されます</p></figcaption></figure>

レスポンスボディを定義します。\
まず、 Slack API のドキュメントにて、どんなレスポンス構造になっているかを確認します。

<figure><img src="https://files.readme.io/eda48d0-CustomAction12.png" alt="734"><figcaption><p>Slack API ドキュメント:conversations.membersのExample responses</p></figcaption></figure>

次に、Anyflow Embed で同様の"型"と"構造"を再現、定義しデータツリーを作成します。

<figure><img src="https://files.readme.io/32663b4-CustomAction13.gif" alt="1429"><figcaption><p>作成した項目をドラッグ&#x26;ドロップし、構造を定義します。必要な情報のみ定義します。</p></figcaption></figure>

{% hint style="warning" %}

### 定義する項目について

後続の処理の中で使用したい項目のみを定義します。\
ドキュメントに明記されている項目を全て定義する必要はありません。\
ここで定義した項目は、後続の処理で利用可能です。
{% endhint %}

これで SlackBot のカスタムアクションが完成したので、テスト実行をしてみましょう。\
トリガーなしでカスタムアクションを迅速にテストしたい場合は、 Click トリガーを使用してテストします。

<figure><img src="https://files.readme.io/a303b27-CustomAction14.gif" alt="571"><figcaption><p>Slack チャンネルのメンバー情報一覧を取得するカスタムアクションが完成</p></figcaption></figure>

上記アクションをテスト実行した際、アクションに渡された入力をテスト履歴から確認可能です。

<figure><img src="https://files.readme.io/f34416c-CustomAction15.png" alt="1438"><figcaption><p>テスト履歴:入力値</p></figcaption></figure>

また、Slack API から返された詳細な出力値を確認し、API コールが成功したかがどうか確認可能です。

<figure><img src="https://files.readme.io/0b3c704-CustomAction16.png" alt="1439"><figcaption><p>テスト履歴:出力値</p></figcaption></figure>

こちらの呼び出しは成功となりました。


# 独自のSlackBotを設定する

## **概要**

SlackBotコネクタには、デフォルトでは**Anyflowが作成したSlackBot**が設定されています。

<figure><img src="https://files.readme.io/c01b9d0-image.png" alt="" width="375"><figcaption></figcaption></figure>

Anyflowのものでない独自のSlackBotを設定する方法について、このページで紹介します。

## **手順**

大まかな流れは以下のとおりです。

1. 独自のSlackBotを作成します（作成済の場合はスキップ可能）
2. SlackBotの Client ID と Client Secret をAnyflow CSチームに共有します
3. Anyflow側で設定を行うと独自のSlackBotからメッセージ投稿が行えるようになります
4. （任意）Slack側でのアプリ審査を行う

### **1.独自のSlackBotを作成する**

[Slack API](https://api.slack.com/)のページから、[Your Apps](https://api.slack.com/apps)に 進みます。

<figure><img src="https://files.readme.io/aab93b3-image.png" alt=""><figcaption></figcaption></figure>

Create New App を選択します。

<figure><img src="https://files.readme.io/ac9fb00-image.png" alt="" width="563"><figcaption></figcaption></figure>

モーダルからFrom scratch を選択します。

<figure><img src="https://files.readme.io/f6fc68d-image.png" alt="" width="563"><figcaption></figcaption></figure>

App Name, workspace を設定し、Create App を選択します。

<figure><img src="https://files.readme.io/85a8286-image.png" alt="" width="563"><figcaption></figcaption></figure>

左メニューから、OAuth & Permissions を選択します。

<figure><img src="https://files.readme.io/ca131c8-image.png" alt=""><figcaption></figcaption></figure>

Redirect URLS の欄で以下のコールバックURLを追加し、Save URLs を押します。

追加するURL：

```
https://for-product-api.anyflow.jp/oauth2/callback
```

<figure><img src="https://files.readme.io/8cbc48c-image.png" alt=""><figcaption></figcaption></figure>

Scopes の欄で以下のスコープを追加します。

追加するスコープ：

```
"users:read",
"chat:write",
"chat:write.public",
"users:read.email"
```

<figure><img src="https://files.readme.io/15b945b-image.png" alt=""><figcaption></figcaption></figure>

左側のメニューから「Manage Distribution」を選択します。

<figure><img src="https://files.readme.io/d45e625885395209d22121a21ccb3ec6a6e24146d75a4b39b7664ec2f6b900c4-image.png" alt=""><figcaption></figcaption></figure>

下にスクロールし、「Share Your App with Other Workspaces」のセクションに進みます。\
4つの条件が全てクリアされていると、「Active Public Distribution」のボタンが有効になります。

<figure><img src="https://files.readme.io/1f3d1e7ff78b6ff1b2c5d199c81009bdae257d01d185de3aa7d382d56b2b8d16-image.png" alt="" width="563"><figcaption></figcaption></figure>

「Active Public Distribution」のボタンを押すと、このアプリは他のワークスペースからでもインストールできるようになります。

<figure><img src="https://files.readme.io/dadeffa5b97c8de80fee2dd63273f9d59eed2e874224e0172207e791986c86f5-image.png" alt=""><figcaption></figcaption></figure>

左メニューから Basic Information に進みます。

<figure><img src="https://files.readme.io/43142c2-image.png" alt=""><figcaption></figcaption></figure>

App Credentials の欄にある Client ID と Client Secret の値をAnyflow CSチームにご共有ください。

<figure><img src="https://files.readme.io/3f00db7-image.png" alt=""><figcaption></figcaption></figure>

Anyflow側にて、OAuth Client をカスタムする設定が完了すると、独自のSlackBotからメッセージ投稿が行えるようになります。

<figure><img src="https://files.readme.io/b972246-image.png" alt="" width="375"><figcaption></figcaption></figure>

Botのアイコンや表示名などの設定も自由に行ってください。\
（基本的に Client ID, Secret に変更がなければ、Botの見た目やスコープなどの設定は即時反映されます。Anyflowへの共有は不要です）

{% hint style="success" %}

### 📘ヒント

Slack Bot 以外のコネクタでも独自のOAuthクライアントを設定できます。\
詳しくはOAuth画面をカスタムするをご確認ください。
{% endhint %}

Slack App Directory にアプリを追加すると、エンドユーザーがApp Directoryからアプリを検索して取得できるようになるほか、以下の「このアプリはSlackによる承認を受けていません。」の表示がなくなります。

<figure><img src="https://files.readme.io/dfebaaa261f69aca97903094232d4a62efb76e039c595539d0863226c0f25c6d-image.png" alt="" width="563"><figcaption></figcaption></figure>

Slack App Directory にアプリを追加するには、Slack側でのアプリ審査が必要となります。\
詳しくは以下のページをご確認ください。

**Slack App ディレクトリにアプリを提出しよう**\
<https://api.slack.com/lang/ja-jp/submitting-apps-to-the-directory>


# 人事労務


# SmartHRの部署データを取得する

SmartHRから部署データを取得する方法について

{% hint style="success" %}

### このレシピについて

このレシピは、[SmartHR API | 部署](https://developer.smarthr.jp/api#%E9%83%A8%E7%BD%B2) を参考に記述されています。
{% endhint %}

## **SmartHRの「部署データ」とは**

SmartHR に登録された部署に関する情報です。\
（参考：[SmartHR API | 部署](https://developer.smarthr.jp/api#%E9%83%A8%E7%BD%B2)）

SmartHR API を利用することで、SmartHR に登録された**部署データ**の一覧を取得できます。

### **SmartHRの「部署データ」の構造**

```json
{
  "id": "string",
  "name": "string",
  "full_name": "string",
  "position": 0,
  "code": "string",
  "parent": "string",
  "children": [
    "string"
  ],
  "updated_at": "2024-05-18T04:14:00.800Z",
  "created_at": "2024-05-18T04:14:00.800Z"
}
```

## **Anyflow Embedで取得する**

Anyflow Embed で SmartHR の部署データを取得する手順を紹介します。

SmartHR の部署データを**スプレッドシートに一括追加する**というシンプルなソリューションを作成し、部署に含まれるデータを把握します。

<figure><img src="https://files.readme.io/f48324b-CleanShot_2024-05-18_at_13.30.342x.png" alt=""><figcaption></figcaption></figure>

### **1. Clickトリガーを設定する**

Clickトリガーを設定します。

<figure><img src="https://files.readme.io/b9650b7-image.png" alt=""><figcaption></figcaption></figure>

### **2. SmartHR コネクタを設定する**

SmartHR コネクタを追加します。本レシピでは背景が白色の SmartHR コネクタを使用します。なお、2つのコネクタの違いについての詳細は[ 2種類のSmartHRコネクタ](broken://pages/X6fHe8FLtamDEervOs2M)について を記載しています。

<figure><img src="https://files.readme.io/9dfd9b1-CleanShot_2024-05-18_at_12.43.302x.png" alt="" width="563"><figcaption></figcaption></figure>

### **3. SmartHR のカスタムアクションを設定する**

ソリューションエディタに戻り、freee人事労務コネクタを以下の通りに設定します。

| 設定項目名       | 設定値             |
| ----------- | --------------- |
| カスタムアクション名  | 部署データを取得する      |
| HTTPメソッド    | GET             |
| リクエストパス     | /v1/departments |
| リクエストヘッダー   | ※ 設定不要          |
| リクエストタイプ    | ※ 設定不要          |
| レスポンスヘッダー定義 | ※ 設定不要          |
| レスポンスタイプ    | json            |

レスポンスボディ定義は以下のように設定します。

<figure><img src="https://files.readme.io/e13614a-CleanShot_2024-05-18_at_13.31.492x.png" alt="" width="563"><figcaption></figcaption></figure>

### **4. スプレッドシートの列名を設定する**

スプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | 1行追加          |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

<figure><img src="https://files.readme.io/677257c-_2024-02-26_17.45.08.png" alt=""><figcaption></figcaption></figure>

「ヘッダーの列名」は以下の通りに設定します。

```
id
name
full_name
code
updated_at
```

「行データ」にも同じ様に設定します。

<figure><img src="https://files.readme.io/7242d14-CleanShot_2024-05-18_at_13.33.312x.png" alt="" width="563"><figcaption></figcaption></figure>

### **5. スプレッドシートに一括追記する**

スプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | 行を一括追加        |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

「ヘッダーの列名」は以下の通りに設定します。

```
id
name
full_name
code
updated_at
```

「リストソース」は以下の通りに設定します。

<figure><img src="https://files.readme.io/3f635f0-CleanShot_2024-05-18_at_13.34.532x.png" alt=""><figcaption></figcaption></figure>

「要素フィールド」は以下の通りに設定します。（「i番目のdepartment」から項目を選択します。）

<figure><img src="https://files.readme.io/b87b44a-CleanShot_2024-05-18_at_13.36.102x.png" alt=""><figcaption></figcaption></figure>

### **6. ウィザードを設定する**

必要な認証をウィザードに追加します。

### **7. テストを行う**

テストを行うと、スプレッドシートにデータが追加されていることがわかります。


# SmartHRの従業員データを取得する

SmartHRから部署データを取得する方法について

{% hint style="success" %}

### このレシピについて

このレシピは、[SmartHR API | 従業員](https://developer.smarthr.jp/api#%E5%BE%93%E6%A5%AD%E5%93%A1) を参考に記述されています。
{% endhint %}

## **SmartHRの「部署データ」とは**

SmartHR に登録された従業員に関する情報です。\
（参考：[SmartHR API | 従業員](https://developer.smarthr.jp/api#%E5%BE%93%E6%A5%AD%E5%93%A1)）

SmartHR API を利用することで、SmartHR に登録された**従業員データ**の一覧を取得できます。

## **SmartHRの「部署データ」の構造**

```json
{
  "emp_code": "string",
  "last_name": "string",
  "first_name": "string",
  "email": "string",
  "tel_number": "string",
  "emp_status": "employed",
  "position": "string",
  "entered_at": "2024-05-18",
  "resigned_at": "2024-05-18",
  "employment_type": {},
  "birth_at": "2024-05-18",
  "gender": "male"
}
```

## **Anyflow Embedで取得する**

Anyflow Embed で SmartHR の従業員データを取得する手順を紹介します。

SmartHR の従業員データを**スプレッドシートに一括追加する**というシンプルなソリューションを作成し、従業員ｆに含まれるデータを把握します。

<figure><img src="https://files.readme.io/d880132-CleanShot_2024-05-18_at_12.41.292x.png" alt=""><figcaption></figcaption></figure>

### **1. Clickトリガーを設定する**

Clickトリガーを設定します。

<figure><img src="https://files.readme.io/b9650b7-image.png" alt=""><figcaption></figcaption></figure>

### **2. SmartHR コネクタを設定する**

SmartHR コネクタを追加します。本レシピでは背景が白色の SmartHR コネクタを使用します。なお、2つのコネクタの違いについての詳細は [2種類のSmartHRコネクタ](broken://pages/X6fHe8FLtamDEervOs2M)2種類について を記載しています。

<figure><img src="https://files.readme.io/9dfd9b1-CleanShot_2024-05-18_at_12.43.302x.png" alt="" width="563"><figcaption></figcaption></figure>

### **3. SmartHR のカスタムアクションを設定する**

ソリューションエディタに戻り、freee人事労務コネクタを以下の通りに設定します。

| 設定項目名       | 設定値         |
| ----------- | ----------- |
| カスタムアクション名  | 従業員データを取得する |
| HTTPメソッド    | GET         |
| リクエストパス     | /v1/crews   |
| リクエストヘッダー   | ※ 設定不要      |
| リクエストタイプ    | ※ 設定不要      |
| レスポンスヘッダー定義 | ※ 設定不要      |
| レスポンスタイプ    | json        |

レスポンスボディ定義は以下のように設定します。

<figure><img src="https://files.readme.io/e48ca1f-CleanShot_2024-05-18_at_12.59.182x.png" alt="" width="563"><figcaption></figcaption></figure>

### **4. スプレッドシートの列名を設定する**

スプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | 1行追加          |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

<figure><img src="https://files.readme.io/677257c-_2024-02-26_17.45.08.png" alt=""><figcaption></figcaption></figure>

「ヘッダーの列名」は以下の通りに設定します。

```
id
last_name
first_name
email
tel_number
```

「行データ」にも同じ様に設定します。

<figure><img src="https://files.readme.io/84cf9ba-CleanShot_2024-05-18_at_13.02.172x.png" alt="" width="563"><figcaption></figcaption></figure>

### **5. スプレッドシートに一括追記する**

スプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | 行を一括追加        |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

「ヘッダーの列名」は以下の通りに設定します。

```
id
last_name
first_name
email
tel_number
```

「リストソース」は以下の通りに設定します。

<figure><img src="https://files.readme.io/8fbe67a-CleanShot_2024-05-18_at_13.03.572x.png" alt=""><figcaption></figcaption></figure>

「要素フィールド」は以下の通りに設定します。（「i番目のcrew」から項目を選択します。）

<figure><img src="https://files.readme.io/14f9e65-CleanShot_2024-05-18_at_13.05.522x.png" alt=""><figcaption></figcaption></figure>

### **6. ウィザードを設定する**

必要な認証をウィザードに追加します。

### **7. テストを行う**

テストを行うと、スプレッドシートにデータが追加されていることがわかります。


# freee人事労務の従業員データを取得する

freee会計から従業員データを取得する方法について

{% hint style="success" %}

### このレシピについて

このレシピは、[freee人事労務 APIリファレンス - 従業員一覧API](https://developer.freee.co.jp/reference/hr/reference#/%E5%BE%93%E6%A5%AD%E5%93%A1/get_employees) を参考に記述されています。
{% endhint %}

## **freee人事労務の「従業員データ」とは**

freee人事労務の事業所に登録された従業員に関連する各種情報です。\
（参考：[入社時の情報を従業員自身が登録する – freee ヘルプセンター](https://support.freee.co.jp/hc/ja/articles/203309730-%E5%85%A5%E7%A4%BE%E6%99%82%E3%81%AE%E6%83%85%E5%A0%B1%E3%82%92%E5%BE%93%E6%A5%AD%E5%93%A1%E8%87%AA%E8%BA%AB%E3%81%8C%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B)）

freee人事労務API を利用することで、指定した事業所に登録された**従業員データ**の一覧を取得できます。

### **freee人事労務の「従業員データ」の構造**

```json
{
  "employees": [
    {
      "id": 0,
      "company_id": 0,
      "num": "string",
      "display_name": "string",
      "base_pension_num": "string",
      "employment_insurance_reference_number": "string",
      "birth_date": "string",
      "entry_date": "string",
      "retire_date": "string",
      "user_id": 0,
      "profile_rule": {},
      "health_insurance_rule": {},
      "welfare_pension_insurance_rule": {},
      "dependent_rules": [],
      "bank_account_rule": {},
      "basic_pay_rule": {},
      "payroll_calculation": true,
      "company_reference_date_rule_name": "当月締め翌月払い"
    }
  ],
  "total_count": 0
}
```

{% tabs %}
{% tab title="JavaScript" %}

```javascript
const message = "hello world";
console.log(message);
```

{% endtab %}

{% tab title="Python" %}

```python
message = "hello world"
print(message)
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
message = "hello world"
puts message
```

{% endtab %}
{% endtabs %}

<details>

<summary></summary>

</details>

<details>

<summary></summary>

</details>

## **Anyflow Embedで取得する**

Anyflow Embedでfreee人事労務の従業員データを取得する手順を紹介します。

freee人事労務の従業員データを**スプレッドシートに一括追加する**というシンプルなソリューションを作成し、取引先に含まれるデータを把握します。

<figure><img src="https://files.readme.io/febce2c-CleanShot_2024-03-09_at_10.24.37.png" alt=""><figcaption></figcaption></figure>

### **1. Clickトリガーを設定する**

Clickトリガーを設定します。

<figure><img src="https://files.readme.io/b9650b7-image.png" alt=""><figcaption></figcaption></figure>

### **2. freee人事労務コネクタを設定する**

freee人事労務コネクタを追加します。

<figure><img src="https://files.readme.io/01fdff0-CleanShot_2024-03-09_at_10.25.27.png" alt=""><figcaption></figcaption></figure>

### **3. 事業所の入力アシストを設定する**

以下の通りエンドユーザー変数を作成します。

<figure><img src="https://files.readme.io/2f152e6-image.png" alt="" width="375"><figcaption></figcaption></figure>

ウィザードの設定に移動します。\
「事業所」のエンドユーザー変数の入力方法を**アシスト**にし、事業所一覧を取得できるようにします。

<figure><img src="https://files.readme.io/58b430a-image.png" alt=""><figcaption></figcaption></figure>

### **4. freee人事労務のカスタムアクションを設定する**

ソリューションエディタに戻り、freee人事労務コネクタを以下の通りに設定します。

| 設定項目名       | 設定値       |
| ----------- | --------- |
| カスタムアクション名  | 従業員データを取得 |
| HTTPメソッド    | GET       |
| リクエストヘッダー   | ※ 設定不要    |
| リクエストタイプ    | ※ 設定不要    |
| レスポンスヘッダー定義 | ※ 設定不要    |
| レスポンスタイプ    | json      |

「リクエストパス」には以下の設定を行います。エンドユーザー変数から「事業所」を選択し、パスの中に含めます。

```
api/v1/companies/{事業所}/employees
```

<figure><img src="https://files.readme.io/032ed38-CleanShot_2024-03-09_at_10.36.21.png" alt=""><figcaption></figcaption></figure>

また、「レスポンスボディ定義」には以下の設定を行います。

<figure><img src="https://files.readme.io/d17030e-image.png" alt="" width="563"><figcaption></figcaption></figure>

```json
{
  "employees": [
    {
      "id": 0,
      "display_name": "string",
      "email": "string",
      "entry_date": "string",
      "retire_date": "string"
    }
  ]
}
```

### **5. スプレッドシートの列名を設定する**

スプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | 1行追加          |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

<figure><img src="https://files.readme.io/677257c-_2024-02-26_17.45.08.png" alt=""><figcaption></figcaption></figure>

「ヘッダーの列名」は以下の通りに設定します。

```
id
display_name
email
entry_date
retire_date
```

「行データ」にも同じ様に設定します。

<figure><img src="https://files.readme.io/8476abb-CleanShot_2024-03-16_at_11.13.43.png" alt="" width="563"><figcaption></figcaption></figure>

### **6. スプレッドシートに一括追記する**

スプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | 行を一括追加        |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

「ヘッダーの列名」は以下の通りに設定します。

```
id
display_name
email
entry_date
retire_date
```

「リストソース」は以下の通りに設定します。

<figure><img src="https://files.readme.io/faab9d8-CleanShot_2024-03-16_at_11.14.25.png" alt=""><figcaption></figcaption></figure>

「要素フィールド」は以下の通りに設定します。（「i番目のemployee」から項目を選択します。）

<figure><img src="https://files.readme.io/9762859-CleanShot_2024-03-16_at_11.15.15.png" alt=""><figcaption></figcaption></figure>

### **7. ウィザードを設定する**

必要な認証をウィザードに追加します。

### **8. テストを行う**

テストを行うと、スプレッドシートにデータが追加されていることがわかります。


# freee人事労務の勤怠データを取得する

freee人事労務から勤怠データを取得する方法について

{% hint style="success" %}

### このレシピについて

このレシピは、[freee人事労務 APIリファレンス - 勤怠API](https://developer.freee.co.jp/reference/hr/reference#/%E5%8B%A4%E6%80%A0/get_employee_work_record) を参考に記述されています。
{% endhint %}

## **freee人事労務の「勤怠データ」とは**

freee人事労務で従業員が登録した勤怠に関する情報です。\
（参考：[勤怠を入力・管理する – freee ヘルプセンター](https://support.freee.co.jp/hc/ja/articles/202849560-%E5%8B%A4%E6%80%A0%E3%82%92%E5%85%A5%E5%8A%9B-%E7%AE%A1%E7%90%86%E3%81%99%E3%82%8B)）

freee人事労務API を利用することで、指定した従業員の **勤怠データ**を取得できます。

### **freee人事労務の「勤怠データ」の構造**

```json
{
  "break_records": [],
  "clock_in_at": "2024-04-27T02:48:11.380Z",
  "clock_out_at": "2024-04-27T02:48:11.380Z",
  "date": "2024-04-27T02:48:11.380Z",
  "day_pattern": "normal_day",
  "schedule_pattern": "",
  "early_leaving_mins": 0,
  "half_paid_holiday_mins": 0,
  "half_special_holiday_mins": 0,
  "hourly_paid_holiday_mins": 0,
  "hourly_special_holiday_mins": 0,
  "is_absence": false,
  "is_editable": true,
  "lateness_mins": 0,
  "normal_work_clock_in_at": "2024-04-27T02:48:11.380Z",
  "normal_work_clock_out_at": "2024-04-27T02:48:11.380Z",
  "normal_work_mins": 0,
  "note": "string",
  "paid_holiday": 0,
  "special_holiday": 0,
  "special_holiday_setting_id": 0,
  "use_attendance_deduction": true,
  "use_default_work_pattern": true,
  "use_half_compensatory_holiday": false,
  "total_overtime_work_mins": 0,
  "total_holiday_work_mins": 0,
  "total_latenight_work_mins": 0,
  "not_auto_calc_work_time": false,
  "total_excess_statutory_work_mins": 0,
  "total_latenight_excess_statutory_work_mins": 0,
  "total_overtime_except_normal_work_mins": 0,
  "total_latenight_overtime_except_normal_work_min": 0
}
```

## **Anyflow Embedで取得する**

Anyflow Embedでfreee人事労務の勤怠データを取得する手順を紹介します。

freee人事労務に登録された特定従業員の特定日の勤怠データを**スプレッドシートに一括追加する**というシンプルなソリューションを作成し、従業員の勤怠データを把握します。

<figure><img src="https://files.readme.io/0f237e0-CleanShot_2024-04-27_at_12.17.44.png" alt=""><figcaption></figcaption></figure>

### **1. Clickトリガーを設定する**

Clickトリガーを設定します。

<figure><img src="https://files.readme.io/b9650b7-image.png" alt=""><figcaption></figcaption></figure>

### **2. freee人事労務コネクタを設定する**

freee人事労務コネクタを追加します。

<figure><img src="https://files.readme.io/01fdff0-CleanShot_2024-03-09_at_10.25.27.png" alt=""><figcaption></figcaption></figure>

### **3. 事業所の入力アシストを設定する**

以下の通りエンドユーザー変数を作成します。

<figure><img src="https://files.readme.io/2f152e6-image.png" alt="" width="375"><figcaption></figcaption></figure>

ウィザードの設定に移動します。\
「事業所」のエンドユーザー変数の入力方法を**アシスト**にし、事業所一覧を取得できるようにします。

<figure><img src="https://files.readme.io/16db921-CleanShot_2024-04-27_at_11.53.58.png" alt=""><figcaption></figcaption></figure>

### **4. 「従業員ID」と「日付」のエンドユーザー変数を設定する**

以下のように「従業員ID」のエンドユーザー変数を設定します。型は「String」を選択します。

<figure><img src="https://files.readme.io/2c96c1f-CleanShot_2024-04-27_at_11.56.25.png" alt=""><figcaption></figcaption></figure>

次に、以下のように「日付」のエンドユーザー変数を設定します。型は「Date」を選択します。

<figure><img src="https://files.readme.io/e0574f0-CleanShot_2024-04-27_at_11.57.24.png" alt=""><figcaption></figcaption></figure>

### **5. freee人事労務のカスタムアクションを設定する**

freee人事労務コネクタを以下の通りに設定します。

| 設定項目名       | 設定値      |
| ----------- | -------- |
| カスタムアクション名  | 勤怠データを取得 |
| HTTPメソッド    | GET      |
| リクエストヘッダー   | ※ 設定不要   |
| リクエストタイプ    | ※ 設定不要   |
| レスポンスヘッダー定義 | ※ 設定不要   |
| レスポンスタイプ    | json     |

「リクエストパス」には以下の設定を行います。エンドユーザー変数から「従業員ID」「日付」を選択し、パスの中に含めます。

```
api/v1/employees/{従業員ID}/work_records/{日付}
```

<figure><img src="https://files.readme.io/0b56c35-CleanShot_2024-04-27_at_12.01.44.png" alt=""><figcaption></figcaption></figure>

「リクエストURLパラメータ」には以下の設定を行います。エンドユーザー変数から「事業所」を選択し値に設定します。

<figure><img src="https://files.readme.io/c940b72-CleanShot_2024-04-27_at_12.04.36.png" alt=""><figcaption></figcaption></figure>

また、「レスポンスボディ定義」には以下の設定を行います。

<figure><img src="https://files.readme.io/8a2df18-CleanShot_2024-04-27_at_12.14.15.png" alt="" width="563"><figcaption></figcaption></figure>

### **6. スプレッドシートの列名を設定する**

スプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | 1行追加          |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

「ヘッダーの列名」は以下の通りに設定します。

```
clock_in_at
clock_out_at
normal_work_mins
is_absence
```

「行データ」にも同じ様に設定します。

<figure><img src="https://files.readme.io/abf9dfd-CleanShot_2024-04-27_at_12.14.45.png" alt="" width="563"><figcaption></figcaption></figure>

### **7. スプレッドシートに一行追記する**

スプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | １行追加          |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

「ヘッダーの列名」は以下の通りに設定します。

```
clock_in_at
clock_out_at
normal_work_mins
is_absence
```

「行データ」は以下の通りに設定します

<figure><img src="https://files.readme.io/6285cd4-CleanShot_2024-04-27_at_12.16.22.png" alt=""><figcaption></figcaption></figure>

### **8. ウィザードを設定する**

必要な認証をウィザードに追加します。

### **9. テストを行う**

テストを行うと、スプレッドシートにデータが追加されていることがわかります。


# 会計


# freee会計の事業所データを取得する

freee会計から事業所データを取得する方法について

{% hint style="success" %}

### このレシピについて

このレシピは、[freee会計 APIリファレンス - 取引先API](https://developer.freee.co.jp/reference/accounting/reference#/Companies) を参考に記述されています。
{% endhint %}

## **freee会計の「事業所データ」とは**

freee会計の事業所データとは、ユーザーが所属する事業所の一覧データです。\
（参考：[freee会計のメンバー招待・権限 - freeeヘルプセンター](https://support.freee.co.jp/hc/ja/articles/203318190-freee%E4%BC%9A%E8%A8%88%E3%81%AE%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E6%8B%9B%E5%BE%85-%E6%A8%A9%E9%99%90)）

### **freee会計の「事業所データ」の構造**

```json
{
  "companies": [
    {
      "id": 1,
      "name": "freee事務所",
      "name_kana": "フリージムショ",
      "display_name": "freee事務所",
      "role": "admin"
    }
  ]
}
```

### **freee会計APIにおける位置づけ**

freee会計のいくつかのAPIでは、**事業所ID**がリクエストの必須項目となっており、そういったAPIを実行するためには事前に事業所データを取得しておく必要があります。

ただしAnyflow Embedでは、エンドユーザー変数で[**アシスト**](/wizard-editor/widget#ashisuto)を設定することで、事業所データの取得が自動的に行われます。エンドユーザーが所属する事業所をリストの中から選択すると、選択した事業所に対応する事業所IDがソリューションの中で使用できます。

そのため、基本的にはソリューションの中で事業所データを独自に取得する必要はありません。

<figure><img src="https://files.readme.io/dad02c1-image.png" alt="" width="563"><figcaption></figcaption></figure>

本レシピでは、上記のアシストが目的に合わず使えない場合や、事業所の一覧を取得したい場合のために、独自に事業所データを取得する方法を紹介します。

Anyflow Embedでfreee会計の事業所データを取得する手順を紹介します。

## **Anyflow Embedで取得する**

freee会計の事業所データを**スプレッドシートに一括追加する**というシンプルなソリューションを作成し、事業所に含まれるデータを把握します。

<figure><img src="https://files.readme.io/4cb30ea-image.png" alt=""><figcaption></figcaption></figure>

### **1. Clickトリガーを設定する**

Clickトリガーを設定します。

<figure><img src="https://files.readme.io/b9650b7-image.png" alt=""><figcaption></figcaption></figure>

### **2. freee会計のカスタムアクションを設定する**

freee会計コネクタを追加します。

<figure><img src="https://files.readme.io/e949f1f-image.png" alt=""><figcaption></figcaption></figure>

以下の通りに設定を行います。

| 設定項目名         | 設定値               |
| ------------- | ----------------- |
| カスタムアクション名    | 事業所データを取得         |
| HTTPメソッド      | GET               |
| リクエストパス       | `api/1/companies` |
| リクエストURLパラメータ | ※ 設定不要            |
| リクエストヘッダー     | ※ 設定不要            |
| リクエストタイプ      | ※ 設定不要            |
| レスポンスヘッダー定義   | ※ 設定不要            |
| レスポンスタイプ      | json              |

また、「レスポンスボディ定義」には以下の設定を行います。

<figure><img src="https://files.readme.io/750d055-image.png" alt=""><figcaption></figcaption></figure>

```json
{
  "companies": [
    {
      "id": 1,
      "name": "freee事務所",
      "name_kana": "フリージムショ",
      "display_name": "freee事務所",
      "role": "admin"
    }
  ]
}
```

### **3. スプレッドシートの列名を設定する**

スプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | 1行追加          |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

<figure><img src="https://files.readme.io/677257c-_2024-02-26_17.45.08.png" alt=""><figcaption></figcaption></figure>

「ヘッダーの列名」は以下の通りに設定します。

```
id
name
name_kana
display_name
role
```

「行データ」にも同じ様に設定します。

<figure><img src="https://files.readme.io/d2fb3bb-image.png" alt="" width="563"><figcaption></figcaption></figure>

### **4. スプレッドシートに一括追記する**

続けてもう1つスプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | 行を一括追加        |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

「ヘッダーの列名」は以下の通りに設定します。

```
id
name
name_kana
display_name
role
```

「リストソース」は以下の通りに設定します。

<figure><img src="https://files.readme.io/e7615d3-CleanShot_2024-02-24_at_20.45.59.png" alt=""><figcaption></figcaption></figure>

「要素フィールド」は以下の通りに設定します。（「i番目のcompany」から項目を選択します。）

<figure><img src="https://files.readme.io/2bb9feb-image.png" alt=""><figcaption></figcaption></figure>

### **5. ウィザードを設定する**

必要な認証をウィザードに追加します。

### **6. テストを行う**

テストを行うと、スプレッドシートにデータが追加されていることがわかります.


# freee会計の取引先データを取得する

freee会計から取引先データを取得する方法について

{% hint style="success" %}

### このレシピについて

このレシピは、[freee会計 APIリファレンス - 取引先API](https://developer.freee.co.jp/reference/accounting/reference#operations-tag-Partners) を参考に記述されています。
{% endhint %}

## **freee会計の「取引先データ」とは**

freee会計では、取引先の情報をマスタとして登録することで、取引の際に入力する摘要の管理を効率化できます。\
（参考：[取引先を登録する - freeeヘルプセンター](https://support.freee.co.jp/hc/ja/articles/360028278932-%E5%8F%96%E5%BC%95%E5%85%88%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B)）

freee 会計API を利用することで、指定した事業所に登録された**取引先データ（マスタ）**&#x306E;一覧を取得できます。

### **freee会計の「取引先データ」の構造**

```json
{
  "partners": [
    {
      "id": 1,
      "code": "code001",
      "company_id": 1,
      "name": "ABC商店",
      "update_date": "2019-12-17",
      "available": true,
      "shortcut1": "ABC",
      "shortcut2": "501",
      "org_code": 1,
      "country_code": "JP",
      "long_name": "新しい取引先正式名称",
      "name_kana": "アタラシイトリヒキサキメイショウ",
      "default_title": "御中",
      "phone": "03-1234-xxxx",
      "contact_name": "営業担当",
      "email": "[email protected]",
      "payer_walletable_id": 1,
      "transfer_fee_handling_side": "payer",
      "qualified_invoice_issuer": false,
      "invoice_registration_number": "T1000000000001",
      "address_attributes": {
        "zipcode": "000-0000",
        "prefecture_code": 4,
        "street_name1": "ＸＸ区ＹＹ１−１−１",
        "street_name2": "ビル１Ｆ"
      },
      "partner_doc_setting_attributes": {
        "sending_method": "posting"
      },
      "partner_bank_account_attributes": {
        "bank_name": "freee銀行",
        "bank_name_kana": "フリーギンコウ",
        "bank_code": "0001",
        "branch_name": "銀座支店",
        "branch_kana": "ギンザシテン",
        "branch_code": "999",
        "account_type": "ordinary",
        "account_number": "1010101",
        "account_name": "フリータロウ",
        "long_account_name": "freee太郎"
      }
    }
  ]
}
```

## **Anyflow Embedで取得する**

Anyflow Embedでfreee会計の取引先データを取得する手順を紹介します。

freee会計の取引先データを**スプレッドシートに一括追加する**というシンプルなソリューションを作成し、取引先に含まれるデータを把握します。

<figure><img src="https://files.readme.io/84c2794-image.png" alt=""><figcaption></figcaption></figure>

### **1. Clickトリガーを設定する**

Clickトリガーを設定します。

<figure><img src="https://files.readme.io/b9650b7-image.png" alt=""><figcaption></figcaption></figure>

### **2. freee会計コネクタを設定する**

freee会計コネクタを追加します。

<figure><img src="https://files.readme.io/07312fd-image.png" alt=""><figcaption></figcaption></figure>

### **3. 事業所の入力アシストを設定する**

以下の通りエンドユーザー変数を作成します。

<figure><img src="https://files.readme.io/2f152e6-image.png" alt="" width="563"><figcaption></figcaption></figure>

ウィザードの設定に移動します。\
「事業所」のエンドユーザー変数の入力方法を**アシスト**にし、事業所一覧を取得できるようにします。

<figure><img src="https://files.readme.io/95141c4-image.png" alt=""><figcaption></figcaption></figure>

### **4. freee会計のカスタムアクションを設定する**

ソリューションエディタに戻り、freee会計コネクタを以下の通りに設定します。

| 設定項目名       | 設定値              |
| ----------- | ---------------- |
| カスタムアクション名  | 取引先データを取得        |
| HTTPメソッド    | GET              |
| リクエストパス     | `api/1/partners` |
| リクエストヘッダー   | ※ 設定不要           |
| リクエストタイプ    | ※ 設定不要           |
| レスポンスヘッダー定義 | ※ 設定不要           |
| レスポンスタイプ    | json             |

「リクエストURLパラメータ」ではキーに`company_id`を、値にはエンドユーザー変数の「事業所」を設定します。

<figure><img src="https://files.readme.io/9a2ffff-image.png" alt="" width="563"><figcaption></figcaption></figure>

また、「レスポンスボディ定義」には以下の設定を行います。

<figure><img src="https://files.readme.io/276a5ce-CleanShot_2024-03-02_at_10.41.242x.png" alt="" width="563"><figcaption></figcaption></figure>

```json
{
  "partners": [
    {
      "id": 1,
      "name": "ABC商店",
      "name_kana": "アタラシイトリヒキサキメイショウ",
      "contact_name": "営業担当",
      "email": "[email protected]"
    }
  ]
}
```

### **5. スプレッドシートの列名を設定する**

スプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | 1行追加          |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

<figure><img src="https://files.readme.io/677257c-_2024-02-26_17.45.08.png" alt=""><figcaption></figcaption></figure>

「ヘッダーの列名」は以下の通りに設定します。

```
id
name
name_kana
contact_name
email
```

「行データ」にも同じ様に設定します。

<figure><img src="https://files.readme.io/fc3592b-CleanShot_2024-03-02_at_10.36.562x.png" alt="" width="563"><figcaption></figcaption></figure>

### **6. スプレッドシートに一括追記する**

スプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | 行を一括追加        |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

「ヘッダーの列名」は以下の通りに設定します。

```
id
name
name_kana
contact_name
email
```

「リストソース」は以下の通りに設定します。

<figure><img src="https://files.readme.io/284e326-CleanShot_2024-03-02_at_10.25.472x.png" alt=""><figcaption></figcaption></figure>

「要素フィールド」は以下の通りに設定します。（「i番目のpartner」から項目を選択します。）

<figure><img src="https://files.readme.io/f17d0c9-image.png" alt=""><figcaption></figcaption></figure>

### **7. ウィザードを設定する**

必要な認証をウィザードに追加します。

### **8. テストを行う**

テストを行うと、スプレッドシートにデータが追加されていることがわかります。


# freee会計の取引データを取得する

{% hint style="success" %}

### このレシピについて

このレシピは、[freee会計 APIリファレンス - 取引API](https://developer.freee.co.jp/reference/accounting/reference#/Deals/get_deals) を参考に記述されています。
{% endhint %}

## **freee会計の「取引データ」とは**

freee会計では、法人や事業の「資産」や「負債」などの増減に関する動きを、用途（勘定科目など）や決済状況とともに「取引」として記録します。\
（参考：[「取引」について - freeeヘルプセンター](https://support.freee.co.jp/hc/ja/articles/360019714252--%E5%8F%96%E5%BC%95-%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)）

freee 会計API を利用することで、指定した事業所に登録された**取引データ**の一覧を取得できます。

### **freee会計の「取引データ」の構造**

```json
{
  "deals": [
    {
      "id": 101,
      "company_id": 1,
      "issue_date": "2019-12-17",
      "due_date": "2019-12-17",
      "amount": 5250,
      "due_amount": 0,
      "type": "expense",
      "partner_id": 201,
      "partner_code": "code001",
      "ref_number": "123-456",
      "status": "settled",
      "deal_origin_name": "手動",
      "details": [],
      "renews": [],
      "payments": [],
      "receipts": []
    }
  ],
  "meta": {
    "total_count": 100
  }
}
```

## **Anyflow Embedで取得する**

Anyflow Embedでfreee会計の取引データを取得する手順を紹介します。

freee会計の取引データを**スプレッドシートに一括追加する**というシンプルなソリューションを作成し、取引先に含まれるデータを把握します。

<figure><img src="https://files.readme.io/84c2794-image.png" alt=""><figcaption></figcaption></figure>

### **1. Clickトリガーを設定する**

Clickトリガーを設定します。

<figure><img src="https://files.readme.io/b9650b7-image.png" alt=""><figcaption></figcaption></figure>

### **2. freee会計コネクタを設定する**

freee会計コネクタを追加します。

<figure><img src="https://files.readme.io/07312fd-image.png" alt=""><figcaption></figcaption></figure>

### **3. 事業所の入力アシストを設定する**

以下の通りエンドユーザー変数を作成します。

<figure><img src="https://files.readme.io/2f152e6-image.png" alt="" width="563"><figcaption></figcaption></figure>

ウィザードの設定に移動します。\
「事業所」のエンドユーザー変数の入力方法を**アシスト**にし、事業所一覧を取得できるようにします。

<figure><img src="https://files.readme.io/95141c4-image.png" alt=""><figcaption></figcaption></figure>

### **4. freee会計のカスタムアクションを設定する**

ソリューションエディタに戻り、freee会計コネクタを以下の通りに設定します。

| 設定項目名       | 設定値           |
| ----------- | ------------- |
| カスタムアクション名  | 取引データを取得      |
| HTTPメソッド    | GET           |
| リクエストパス     | `api/1/deals` |
| リクエストヘッダー   | ※ 設定不要        |
| リクエストタイプ    | ※ 設定不要        |
| レスポンスヘッダー定義 | ※ 設定不要        |
| レスポンスタイプ    | json          |

「リクエストURLパラメータ」ではキーに`company_id`を、値にはエンドユーザー変数の「事業所」を設定します。

<figure><img src="https://files.readme.io/9a2ffff-image.png" alt=""><figcaption></figcaption></figure>

また、「レスポンスボディ定義」には以下の設定を行います。

<figure><img src="https://files.readme.io/49f22b9-CleanShot_2024-03-09_at_10.01.09.png" alt=""><figcaption></figcaption></figure>

```json
{
  "deals": [
    {
      "id": 101,
      "issue_date": "2019-12-17",
      "amount": 5250,
      "type": "expense",
      "status": "settled"
    }
  ]
}
```

### **5. スプレッドシートの列名を設定する**

スプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | 1行追加          |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

<figure><img src="https://files.readme.io/677257c-_2024-02-26_17.45.08.png" alt=""><figcaption></figcaption></figure>

「ヘッダーの列名」は以下の通りに設定します。

```
id
issue_date
amount
type
status
```

「行データ」にも同じ様に設定します。

<figure><img src="https://files.readme.io/3fb1d7b-CleanShot_2024-03-09_at_10.03.57.png" alt=""><figcaption></figcaption></figure>

### **6. スプレッドシートに一括追記する**

スプレッドシートコネクタを追加し、以下の通りに設定を行います。

| 設定項目名      | 設定値           |
| ---------- | ------------- |
| アクション      | 行を一括追加        |
| スプレッドシートID | 任意のスプレッドシートID |
| シートID      | 任意のシートID      |

「ヘッダーの列名」は以下の通りに設定します。

```
id
issue_date
amount
type
status
```

「リストソース」は以下の通りに設定します。

<figure><img src="https://files.readme.io/e842c5e-CleanShot_2024-03-09_at_10.05.32.png" alt=""><figcaption></figcaption></figure>

「要素フィールド」は以下の通りに設定します。（「i番目のdeal」から項目を選択します。）

<figure><img src="https://files.readme.io/b88eab1-CleanShot_2024-03-09_at_10.06.53.png" alt=""><figcaption></figcaption></figure>

<figure><img src="https://files.readme.io/93b2abd-CleanShot_2024-03-02_at_10.49.392x.png" alt=""><figcaption></figcaption></figure>

### **7. ウィザードを設定する**

必要な認証をウィザードに追加します。

### **8. テストを行う**

テストを行うと、スプレッドシートにデータが追加されていることがわかります。


# freeeコネクタのスコープを変更する

## 概要

Anyflow Embed のウィザードでコネクタの認証を行う際、OAuthによる認証方式をとっているコネクタでは許可するスコープ（権限）が表示されます。

<figure><img src="https://files.readme.io/64e3da9-image.png" alt="例：freee会計コネクタのスコープ" width="400"><figcaption><p>例：freee会計コネクタのスコープ</p></figcaption></figure>

基本的には、このスコープは変更することなく様々なアクションを実行できるようになっていますが、スコープを広げる・狭めることも可能です。このページでは、スコープを調整する方法についてご説明します。

## 手順

対象のSaaSによって詳細は異なりますが、大まかに共通する流れは以下のとおりです。

1. 対象のSaaSにおいて、開発者ポータルなどから独自のアプリを作成します
2. 作成したアプリの Client ID と Client Secret をAnyflow CSチームに共有します
3. Anyflow側で設定を行うと、独自のアプリを通じた認証が行えるようになります

{% hint style="success" %}

### アプリ配布の制限

SaaSの開発者ポータルでアプリを使用する場合は基本的にはスムーズにアプリを使用できることが多い一方で、第三者へアプリ提供を行う場合には審査等の手続きが必要な場合があります。

詳しくは各SaaSの開発者ポータルをご確認ください。
{% endhint %}

今回は例として、開発者向けにfreee会計コネクタのスコープを調整する方法をご紹介します。

### 1. 独自アプリの作成

### 1-1. 開発者アカウントの作成

以下のページのステップ1を参照して、開発者アカウントを作成します。

<https://developer.freee.co.jp/startguide#1-%e3%82%bb%e3%83%83%e3%83%88%e3%82%a2%e3%83%83%e3%83%97>

#### 1-2. アプリの作成

以下のページを参照して、独自のアプリを作成します。

<https://developer.freee.co.jp/startguide/starting-api>

コールバックURLには以下を設定します。

```
https://for-product-api.anyflow.jp/oauth2/callback
```

アプリの Client ID / Secret を控えておきます。

#### 1-3. スコープの設定

以下のページを参照して、アプリに許可するスコープを設定します。

<https://developer.freee.co.jp/startguide/deploy-app#%e6%a8%a9%e9%99%90%e8%a8%ad%e5%ae%9a%e3%82%92%e8%a1%8c%e3%81%86>

今回は **\[会計] 勘定科目 の参照** のみを許可します。

<figure><img src="https://files.readme.io/eb5fb01-image.png" alt="" width="375"><figcaption></figcaption></figure>

### 2. Client ID / Secret の共有

Anyflow CSチームに以下の情報を共有します。

* 対象のコネクタ（今回は「freee会計コネクタ」）
* Client ID
* Client Secret

### 3. Anyflowでの設定

Anyflow側での設定が完了すると、スコープが変更されたコネクタを利用できるようになります。

<figure><img src="https://files.readme.io/25833ad-image.png" alt="" width="375"><figcaption></figcaption></figure>

{% hint style="warning" %}

### ソリューションエディタのヘルプテキストは変更されません

ソリューションエディタでカスタムアクションを選んだ際に表示されるヘルプテキストにはAnyflowがデフォルトで設定したスコープが記載されています。

現時点では、独自アプリによるスコープ変更を行ったとしてもこのヘルプテキストは変更されません。
{% endhint %}

<figure><img src="https://files.readme.io/8c4fafb-image.png" alt="カスタムアクションのヘルプテキスト" width="400"><figcaption><p>カスタムアクションのヘルプテキスト</p></figcaption></figure>

### 4. アプリの公開を行う

公開用のアプリを作成する場合は以下の手順で実施します。freeeの場合は審査が必要となります。

<https://developer.freee.co.jp/startguide/deploy-app>


# グループウェア

グループウェア


# Google DriveのOAuthアプリを作成する

このセクションでは、Google DriveのOAuthアプリを作成する例をご紹介します。\
必要に応じて[公式ドキュメント](https://support.google.com/cloud/answer/10311615)もご参照ください。

## 手順

### 1. 使用するサービスのAPIを有効にする

[APIライブラリ](https://console.cloud.google.com/apis/library)から、ソリューションで使われるサービスのAPIを有効にします。

例えば、Google Driveを利用するソリューションの場合、APIライブラリからGoogle Driveを検索し、上記のページから「有効にする」ボタンを押下します。

APIライブラリから、サービスのAPIを有効にすると、OAuth同意画面のスコープ設定でサービスのスコープを選択できます。

<figure><img src="https://files.readme.io/c9fb2ad-3_Google_Drive.png" alt="" width="563"><figcaption></figcaption></figure>

### 2. Google Cloud Platform の OAuth同意画面

[OAuth 同意画面](https://console.cloud.google.com/apis/credentials/consent)にアクセスします。

<figure><img src="https://files.readme.io/a9c5436-1_OAuth.png" alt="" width="563"><figcaption></figcaption></figure>

　「外部」にチェックを入れ、作成します。

### 3. アプリの編集

<figure><img src="https://files.readme.io/a5268ab-2_.png" alt="" width="563"><figcaption></figcaption></figure>

認証画面に表示されるアプリ名や、ロゴ、ドメインの設定をします。\
設定後、「保存して次へ」ボタンを押下します。

### 4. スコープの設定

スコープ設定画面の「スコープを追加または削除」ボタンを押下すると以下のような画面が表示されます。

<figure><img src="https://files.readme.io/10fe0cf-4_scope.png" alt="" width="563"><figcaption></figcaption></figure>

表示されたサイドバーの「フィルタ」に 「Google Drive」と入力すると、Google Driveにまつわるスコープが表示されます。\
このスコープの中から、ソリューションの実行に必要なスコープを選択し、「更新」ボタンを押下します。

スコープ追加後、「保存して次へ」ボタンを押下します。

### 5. テストユーザーを追加

<figure><img src="https://files.readme.io/404e4e0-test_user.png" alt="" width="563"><figcaption></figcaption></figure>

公開ステータスが「テスト中」に設定されている間は、テストユーザーのみがアプリにアクセスできるため、テストユーザーを追加します。

「ADD USERS」ボタンを押下し、ソリューションを試したいユーザーのメールアドレスを追加します。

テストユーザーを追加後、「保存して次へ」ボタンを押下します。

### 6. 認証情報を作成

[認証情報](https://console.cloud.google.com/apis/credentials)にアクセスします。

<figure><img src="https://files.readme.io/8ad221d-credentials.png" alt="" width="563"><figcaption></figcaption></figure>

「認証情報を作成」ボタンを押下した後、「OAuth クライアント ID」を押下します。\
「アプリケーションの種類」を `ウェブアプリケーション` に設定します。

「承認済みのリダイレクト URI」については、以下を参照して設定してください。

[リダイレクトURLのDNS設定](/connectors/custom-oauth-client#dnsganaksu)

{% hint style="danger" %}
GoogleのOAuthアプリの場合、リダイレクトURL（CallbackURI）は承認済みドメインである必要があります。\
AnyflowのリダイレクトURLを設定すると、審査通過できないため上記のページを参照してください。
{% endhint %}

リダイレクトURLの設定後、「作成」ボタンを押下します。

<figure><img src="https://files.readme.io/39fa60a-credentials_2.png" alt="" width="563"><figcaption></figcaption></figure>

「作成」ボタン押下後、以下のようなモーダルウィンドウが表示されます。

モーダルウィンドウに表示されている `クライアント ID` と `クライアント シークレット` をコピーし、Anyflowチームに受け渡します。

<figure><img src="https://files.readme.io/3755d47-credentials_3.png" alt="" width="375"><figcaption></figcaption></figure>

### 7. ソリューションをテストする

ベンダープロダクトにAnyflowSDKを使ってソリューションを組み込みます。\
ウィザードを表示し、Google Driveの認証をする際に先ほど作成したアプリの名前やロゴが表示されていることを確認後、正常に認証ができればテストは完了です。

{% hint style="warning" %}

### 公開ステータスがテストのままだとどうなる?

公開ステータスがテストのままでも認証は可能ですが、アプリに権限を付与できるユーザーの数が100ユーザーまで制限されます。
{% endhint %}

### 8. OAuthアプリを本番環境にPushする

[OAuth 同意画面](https://console.cloud.google.com/apis/credentials/consent) にアクセスし、アプリを公開ボタンを押下し、モーダルウィンドウの「確認」を押下します。

<figure><img src="https://files.readme.io/c119447-Screen_Shot_2021-05-21_at_9.27.06_PM.png" alt="" width="563"><figcaption></figcaption></figure>

追加しているスコープによっては、以下の画像のようにステータスが`確認が必要` になるケースがありますので、場合に応じて「確認を準備する」ボタンを押下して必須項目を埋めます。

<figure><img src="https://files.readme.io/3cfa2d2-Screen_Shot_2021-05-21_at_9.30.55_PM.png" alt="" width="563"><figcaption></figcaption></figure>

スコープが必要である理由や、デモ動画を入力し、「最終レビュー」セクションで、「確認のため送信」ボタンを押下し、Googleの審査を待ちましょう。

<figure><img src="https://files.readme.io/9f8bfed-Screen_Shot_2021-05-21_at_9.32.24_PM.png" alt="" width="563"><figcaption></figcaption></figure>

Google DriveのOAuthアプリを作成する例は以上です。

Google Workspaceサービス以外のSlackやSalesforceも類似した工程を踏むことで、OAuthアプリを作成できます。詳細は各サービスのドキュメントを参考にしてください。


# ソリューションエディタとは

## **概要**

このページでは、連携ソリューションを構築する際に使用する「ソリューションエディター」について説明します。

<figure><img src="https://files.readme.io/7eac669-6139b0f-solution_editor.png" alt="3152"><figcaption><p>ソリューションエディター</p></figcaption></figure>

ソリューションエディターは以下の要素から構成されます。

* トリガー
* ステップ
* 変数

***

## **1. トリガー**

<figure><img src="https://files.readme.io/2c54696-image.png" alt=""><figcaption></figcaption></figure>

トリガーは、ソリューションを実行するためにどのアプリのイベントを起点に実行するかを決定する、ソリューション起動のきっかけになるものです。

トリガーイベントは、アプリ（Salesforce や kintone など）で特定のイベント（例: 新規コンタクトの作成や既存のレコードの更新）が発生した際に起動させることができます。

Anyflowはトリガーイベントをリアルタイムで受信したり、アプリをポーリングして定期的にイベントの発生をチェックしたりすることができます。

### **トリガーの種類**

<figure><img src="https://files.readme.io/f02bf9f-image.png" alt="kintoneの例"><figcaption><p>kintoneの例</p></figcaption></figure>

[ポーリングトリガー](/solution-editor/triggers/incoming/polling-triggers) は、Anyflowがアプリの状態を定期的に確認し、トリガーイベントの発生をチェックする方法です。

[リアルタイムトリガー](/solution-editor/triggers/incoming/realtime-triggers) は、アプリからAnyflowにトリガーイベントの発生を送信する方法です。

### **トリガー条件**

どのようなトリガーイベントを選択して処理するか、追加のルールを設定することができます。

[トリガー条件](/solution-editor/triggers/triggers-conditions)

***

## **2. ステップ**

ステップは、アクション、if、繰り返しなどから構成されます。

<figure><img src="https://files.readme.io/7df92be-image.png" alt=""><figcaption></figcaption></figure>

### **ステップの種類**

[アクションステップ](/solution-editor/actions)は、アプリの操作（例: 作成、更新、検索など）を実行するものです。

[ifステップ](/solution-editor/logic/if)は、指定された条件が満たされた場合に、ステップを実行することができます。

[繰り返しステップ](/solution-editor/logic/loop)は、リスト（複数のレコード等）に対して、リストの個数分だけステップを繰り返すものです。

[エラー監視ステップ](/solution-editor/logic/error-monitoring)を使うと、「エラー監視」のステップでエラーが発生した場合、「エラーならば」ステップの処理に遷移します。

[停止ステップ](/solution-editor/logic/stop)を使うと、任意のステップで処理の実行を停止することができます。

### **ステップの操作について**

<figure><img src="https://files.readme.io/9e9c732-image.png" alt="" width="563"><figcaption></figcaption></figure>

以下の操作が可能です。

* **ドラッグアンドドロップ**：ステップの順番を変更することができます

  <figure><img src="https://files.readme.io/5887e26-image.png" alt=""><figcaption></figcaption></figure>
* **コメント**：ステップにコメントを記述することができます

  <figure><img src="https://files.readme.io/3492ace-image.png" alt=""><figcaption></figcaption></figure>
* **コピー**：ステップをコピーすることができます

  <figure><img src="https://files.readme.io/acf7e19-image.png" alt=""><figcaption></figcaption></figure>
* **ペースト**：コピーしたステップを貼り付けることができます。ソリューションをまたいだペーストも可能です。

  <figure><img src="https://files.readme.io/bb4c956-image.png" alt=""><figcaption></figcaption></figure>
* **削除**：ステップを削除できます

  <figure><img src="https://files.readme.io/94faf28-image.png" alt=""><figcaption></figcaption></figure>

## **3. 変数と変数ウィンドウ**

変数は、トリガーやアクションなどのステップから出力されるデータのことです。

出力されたデータは変数ウィンドウから参照でき、別のステップで利用することができます。

<figure><img src="https://files.readme.io/d7ee8c0-variable-mapping.png" alt="1296"><figcaption><p>変数の<code>チャンネル名</code> を アクションの <code>投稿するチャンネル</code> に割り当てている例</p></figcaption></figure>

変数と変数ウィンドウの詳細は以下のページを確認してください。

[変数ウィンドウ](/solution-editor/variables)

## **4. Formula**

入力フィールドで高度な入力やデータの加工などを行うには、Formulaモードを利用します。

FormulaはPythonによって記述することができます。\
Formulaを使うためには、Formulaモードにする必要があります。

<figure><img src="https://files.readme.io/76c34c6-Formula1.gif" alt="760"><figcaption><p>Formulaモードは<code>fx</code>マークで表示されます</p></figcaption></figure>

Formulaの詳細は以下のページを確認してください。

[Formula](/solution-editor/common-specs/formula)


# トリガー


# 自社プロダクト起点

自社プロダクトを起点にして連携を実行するトリガー


# Clickトリガー

Clickトリガーの設定方法について

## **概要**

ClickトリガーはAnyflowの標準アプリで、エンドユーザーが`実行`ボタンをクリックした際に実行されます。

<figure><img src="https://files.readme.io/ed7f536-click-button.png" alt="843"><figcaption><p><code>実行</code>ボタン</p></figcaption></figure>

## **ワークフローを手動実行**

Clickトリガーの「ワークフローを手動実行」を選択します。

※ デフォルトで選択された状態となっています。

<figure><img src="https://files.readme.io/cf8dbc6-workflow-manual.png" alt=""><figcaption></figcaption></figure>

## **アウトプット**

| フィールド名           | 説明                                                 |
| ---------------- | -------------------------------------------------- |
| Click User Name  | クリックしたエンドユーザーの名前です。                                |
| Click User Email | クリックしたエンドユーザーのメールアドレスです。JWTのペイロードに含まれているメールアドレスです。 |


# Requestトリガー

## **概要**

Requestトリガーを使用すると、自社プロダクトからAnyflowにAPIリクエストを送信することでソリューションを実行することができます。\
ソリューションの実行が終わると、実行結果がAPIレスポンスとして返却されます。

例えば外部SaaSのデータを自社プロダクトのDBに取り込む場合などに、\
**自社のAPIを用意しなくてもデータを取得することができます**。

Requestトリガーを使用したソリューションを実行するまでの流れは次のようになります：

<table><thead><tr><th width="51.66015625">#</th><th>内容</th><th>場所</th></tr></thead><tbody><tr><td>1</td><td>Requestトリガーをソリューションに適用する</td><td>Anyflow Embed 管理画面</td></tr><tr><td>2</td><td>エンドポイントが発行される</td><td>Anyflow Embed 管理画面</td></tr><tr><td>3</td><td><strong>エンドポイントにAPIリクエストを送信する</strong></td><td><strong>自社プロダクトのサーバー</strong></td></tr><tr><td>4</td><td>ソリューションが実行される</td><td>Anyflow Embed</td></tr><tr><td>5</td><td><strong>実行結果をAPIレスポンスとして受け取る</strong></td><td><strong>自社プロダクトのサーバー</strong></td></tr></tbody></table>

{% hint style="success" %}

### エンドユーザーでのインストールは必要です

他のトリガーと同様、エンドユーザーがソリューションをインストールしている場合のみ実行されます。

エンドユーザーがソリューションをインストールしていない場合、RequestトリガーのAPIリクエストを送信してもソリューションは実行されません。
{% endhint %}

## **使用方法**

トリガーで「Request & Response」を選択します。

<figure><img src="https://files.readme.io/d1dcf49-image.png" alt=""><figcaption></figcaption></figure>

自社プロダクトから送信するリクエストのペイロードを定義します。\
ここでは例として firstname, lastname, email というシンプルな3項目を定義します。

<figure><img src="https://files.readme.io/5000506-image.png" alt=""><figcaption></figcaption></figure>

次に、このソリューションの処理結果を自社プロダクトに返却するために、レスポンス定義を設定します。

<figure><img src="https://files.readme.io/a2fdb72-image.png" alt=""><figcaption></figcaption></figure>

<table><thead><tr><th width="216.4296875">項目</th><th>説明</th></tr></thead><tbody><tr><td>レスポンス名</td><td>後述の<a href="/pages/kcB40BqXF6ExxQl04t7e">Responseステップ</a>でこのレスポンス定義を呼び出すために使用します。<br>APIレスポンスの中にはこの名前は反映されません。</td></tr><tr><td>レスポンスペイロード</td><td>APIレスポンスのペイロードスキーマを定義できます。<br>ここで設定するのは「スキーマ」のみです。<br>実際のレスポンスの「値」は後述の<a href="/pages/kcB40BqXF6ExxQl04t7e">Responseステップ</a> で設定します。</td></tr></tbody></table>

参考：レスポンスボディの仕様

```json
{
  "job": {
    "id": string,
    "state": "succeeded" | "failed"
  },
  "payload": {
    // レスポンスペイロードで定義したスキーマ
  }
}
```

今回は、　レスポンス名：created　レスポンスペイロード：id　として設定します。

<figure><img src="https://files.readme.io/042b2a4-image.png" alt="" width="563"><figcaption></figcaption></figure>

次にアクションを適用します。\
アクションの設定ではリクエストペイロードの値を使用できます。

ここではHubSpotの「人物情報を作成」アクションを設定します。

<figure><img src="https://files.readme.io/3351897-image.png" alt=""><figcaption></figcaption></figure>

3つ目のステップとしてResponseステップを適用します。\
「ステップを追加」 から「レスポンス」を選択します。

<figure><img src="https://files.readme.io/cea8777-image.png" alt=""><figcaption></figcaption></figure>

Responseステップの設定にて、レスポンス名から先ほど作成した「created」を選択します。

<figure><img src="https://files.readme.io/e1d500d-image.png" alt=""><figcaption></figcaption></figure>

ステップ1のRequestトリガーで作成したスキーマ定義が呼び出され、APIレスポンスとして返却する値を設定できます。

<figure><img src="https://files.readme.io/066f3ce-image.png" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}

### ヒント

Responseステップを適用しない場合には、payloadを含まないレスポンスが返却されます。
{% endhint %}

参考：Resopnseステップを適用しない場合のレスポンス

```json
{
  "job": {
    "id": string,
    "state": "succeeded" | "failed"
  }
}
```

## **Responseステップを複数配置する**

Responseステップはソリューションの中で複数配置することが可能です。\
例えば以下のように、ifなどと組み合わせて状況に応じたレスポンスをすることができます。

<figure><img src="https://files.readme.io/e97f1b4-image.png" alt="" width="563"><figcaption></figcaption></figure>

Responseステップの仕様の詳細は[こちら](/solution-editor/triggers/outgoing/request-triggers/response-step)をご確認ください。

## **テスト**

テストモードを起動すると、1度のみリクエストを受け付けます。\
リクエストに必要なcURLの例が表示されるので、ペイロードの値を変更しつつご自身の環境から実行してください。

<figure><img src="https://files.readme.io/9098d1f-image.png" alt=""><figcaption></figcaption></figure>

リクエストを送信すると、ソリューションが実行されます。\
実行が完了すると、テスト結果画面が表示されます。

<figure><img src="https://files.readme.io/b3f36b9-image.png" alt=""><figcaption></figcaption></figure>

{% hint style="danger" %}

### ヘッダーにアクセストークンの値が表示されない場合

「cURLで実行」のサンプルコードの中でAuthorizationヘッダーにアクセストークンの具体的な値が設定されていない場合は、[API Secretの生成画面](https://embed.anyflow.jp/settings/api-secret)でSecretキーを生成してから再度お試しください。\
一度生成してあれば、テストの度に生成する必要はありません。
{% endhint %}

<figure><img src="https://files.readme.io/ec495330e02a1218c5390092dc9eea288c9fa66817fbc7b72ccbc1a6c2f2d3ea-image.png" alt="アクセストークンの値が表示されていない場合"><figcaption><p>アクセストークンの値が表示されていない場合</p></figcaption></figure>

<figure><img src="https://files.readme.io/413faaf304cdab9c24d2a69192b5b6e570c256b3e47a2ff094e0becb1bed59a2-image.png" alt="API Secret の生成画面"><figcaption><p>API Secret の生成画面</p></figcaption></figure>

## **本番実装**

自社プロダクトの環境でリクエストを送信する場合は、[Vender Server API](/anyflow-api/vender-server-api) の仕様書を見ながら実装してください。

手順：

1. リクエストトリガー用のアクセストークンを取得する `POST /token`
2. ソリューションインスタンスを取得する `GET /solution_instances`
3. リクエストトリガーを発火させる `POST /request_trigger`


# Responseステップ

## **概要**

Responseステップは、トリガーに[Requestトリガー](/solution-editor/triggers/outgoing/request-triggers)を選択した場合のみ使用できます。

RequestトリガーはソリューションをAPIリクエストにより実行することができるトリガーですが、\
Responseステップを使用すると、ソリューションの処理で得た値をAPIレスポンスとして返却することができます。

## **設定**

RequestトリガーからResponseステップを呼び出す方法は、[Requestトリガー](/solution-editor/triggers/outgoing/request-triggers)のページをご確認ください。

このページでは、Responseステップの詳細な設定について説明します。

### **実行ステータス**

Responseステップより後に配置されたステップは実行されません。\
Responseステップは[停止ステップ](/solution-editor/logic/stop)と同様にソリューションの処理は完了にする機能を持っています。

Responseステップの「実行ステータス」の設定では、ソリューションの処理を完了する際、\
ステータスを「成功」として扱うか「失敗」として扱うかを設定することができます。

<figure><img src="https://files.readme.io/0f39b38-image.png" alt=""><figcaption></figcaption></figure>

* 実行ステータス&#x3067;**「成功にする」**&#x3092;選択すると、その実行履歴の状態は成功となります。
* 実行ステータス&#x3067;**「失敗にする」**&#x3092;選択すると、その実行履歴の状態は失敗となります。\
  **「メッセージ」**&#x306B;は、停止ステップにより実行失敗となった際に出力するメッセージを指定できます。

詳細は[停止ステップ](/solution-editor/logic/stop)のページを確認してください。

### **レスポンス名**

Requestトリガーで設定したレスポンスペイロードのスキーマを呼び出すことができます。

<figure><img src="https://files.readme.io/d706aeb-image.png" alt="" width="563"><figcaption></figcaption></figure>

### **レスポンス ペイロード**

レスポンス名が指定されると、レスポンスペイロードが表示されます。\
任意の値や変数をペイロードに設定することができます。

<figure><img src="https://files.readme.io/e276ec6-image.png" alt=""><figcaption></figcaption></figure>

## Responseステップを複数配置する

Responseステップはソリューションの中で複数配置することが可能です。\
例えば以下のように、ifなどと組み合わせて状況に応じたレスポンスをすることができます。

<figure><img src="/files/eSvHRMxxsSQaoys94yiq" alt="" width="563"><figcaption></figcaption></figure>

Responseステップを直列に複数つなげることも可能ですが、先に処理されたレスポンスが優先され、そこでソリューションは停止します。つまり、以下の図では4番のステップは実行されません。

<figure><img src="https://files.readme.io/d7b03e8-image.png" alt="" width="563"><figcaption></figcaption></figure>

## **注意点**

* ソリューションの実行が5秒以内に終わる場合でも、Responseが返却されるまで少なくとも5秒程度かかります。
* Responseステップで指定した値を返却できるのは、ソリューションの実行が**5分以内で完了する場合のみ**です。
  * 5分以上かかった場合には5分経過時点で下記のようなレスポンスが返却されます。

    ```json
    {
      "message": "HTTP request timed out because Job execution was too long. Job continues to run.",
      "detail": {
        "job": {
          "id": string
        }
      }
    }
    ```
  * ソリューションの組み方によっては実行時間を短縮できる場合があるため、不安な場合はAnyflow CSチームにご連絡ください。


# My Eventトリガー

My Eventの概要と設定方法について

## **概要**

My Event を使用すると、自社プロダクトで発生したイベントをもとに Anyflow のソリューションを実行することができます。

My Event を使用したソリューションを実行するまでの流れは次のようになります：

<table><thead><tr><th width="40">#</th><th width="457.05859375">内容</th><th>場所</th></tr></thead><tbody><tr><td>1</td><td>My Event を作成する</td><td>Anyflow Embed 管理画面</td></tr><tr><td>2</td><td>ソリューションのトリガーで使用する My Event を選択しデプロイ</td><td>Anyflow Embed 管理画面</td></tr><tr><td>3</td><td><strong>My Event エンドポイントにAPIリクエストを送信する</strong></td><td><strong>自社プロダクト</strong></td></tr><tr><td>4</td><td>My Event を使用したソリューションが実行される</td><td>Anyflow Embed</td></tr></tbody></table>

{% hint style="success" %}

### エンドユーザーでのインストールは必要です

他のトリガーと同様、エンドユーザーがソリューションをインストールしている場合のみ実行されます。

エンドユーザーがソリューションをインストールしていない場合、My Event のAPIリクエストを送信してもソリューションは実行されません。
{% endhint %}

## **My Event を作成する**

My Event は管理画面から作成できます。

My Event を作成するためには以下の情報が必要です。

<table><thead><tr><th width="95.9140625">プロパティ</th><th>説明</th></tr></thead><tbody><tr><td>名前</td><td>My Event の表示名です。管理画面上の UI に表示する目的で使用します。</td></tr><tr><td>キー</td><td>My Event を識別するためのキーです。My Event エンドポイントへのリクエストに指定します。</td></tr><tr><td>スキーマ</td><td>My Event のペイロードの構造を表すスキーマです。My Event トリガーの変数の型として使用します。任意のスキーマを指定することができます。</td></tr></tbody></table>

ここでは例として、次のように設定します。

<table><thead><tr><th width="250.421875">プロパティ</th><th>値</th></tr></thead><tbody><tr><td>名前</td><td>ユーザーが作成された時</td></tr><tr><td>キー</td><td>user_created</td></tr><tr><td>スキーマ</td><td>{<br>"user_name": "john",<br>"is_admin": false<br>}</td></tr></tbody></table>

スキーマには有効な JSON を指定します。 JSON 内で指定した値（この例では `"john"` と `false`）はソリューションエディタ内での変数のサンプル値や、テスト実行時のテスト値として使用されます。

## **ソリューションのトリガーで使用する My Event を選択する**

My Event が送信されたときに実行したいソリューションのソリューションエディタを開き、トリガーとして「My Event トリガー」を選択してから使用する My Event を選択します。

My Event を選択すると、トリガーの変数として、選択した My Event のペイロードが使えるようになります。ペイロード変数の型は My Event を作成するときに指定したスキーマに従います。

ここでは例として、先程作成した `ユーザーが作成された時` を選択します。この My Event を選択すると、トリガーの変数として文字列型の `user_name` 変数と、論理型の `is_admin` 変数をプロパティとして持つ `ペイロード` 変数が使用できるようになります。

{% hint style="success" %}

### 複数のソリューションを同時に実行する

同じ My Event を複数のソリューションのトリガーとして設定することもできます。そうした場合、My Event が送信されたときに以下を満たす全てのソリューションが実行されます。

* その My Event をトリガーに使用していること
* エンドユーザーがソリューションをインストールしていること

例えば、\
My Eventを使用したソリューション A, B, C が存在する状態で\
エンドユーザーが A, B をインストールしていた場合、\
My Eventを実行するとA, Bが実行されます。
{% endhint %}

## **My Event エンドポイントにリクエストを送信する**

以下の My Event エンドポイントに対してリクエストを送信することで、指定した My Event を使用しているソリューションを実行することができます。

**`https://for-product-api.anyflow.jp/sdk/send_my_event`**

My Event エンドポイントへのリクエストには[アクセストークン](/solution-editor/triggers/outgoing/my-event/access-token)が必要です。指定されたアクセストークンに紐づくエンドユーザーのソリューションが実行されます。

リクエストボディには次のような JSON を指定します。

```json
{
  "key": "user_created",
  "payload": {
    "user_name": "taro",
    "is_admin": true
  }
}
```

`key` には実行したい My Event のキーを、 `payload` には My Event のペイロードとして使用する値を指定します。ペイロードは My Event のスキーマとして指定した JSON と同じ構造でなければなりません。

リクエストが受理されると、アクセストークンに紐づいたエンドユーザーの、送信した My Event （この例では `ユーザーが作成された時`）を使用しているソリューションが全て実行されます。

### **404エラーとなるケース**

レスポンスが404エラーとなり「my\_event\_not\_found\_or\_stopped」というメッセージが返却される場合は、以下の状況が考えられます。

* 指定した My Event が見つからない
* 指定した My Event を使用するソリューションが存在しない
* 指定した My Event を使用するソリューションをエンドユーザーがインストールしていない
* 指定した My Event を使用するソリューションをエンドユーザーが無効にしている

なお、My Event リクエストに対するレスポンスは基本的に「Anyflowサーバーが正しいリクエストを受け取れたかどうか」のみを判定して返却しています。

正常（200）の場合でもエラー（404）の場合でも、レスポンスはソリューションの処理結果を待たずに瞬時に返却されます。

{% hint style="success" %}

### ヒント

詳細なAPI仕様は[APIリファレンス](/anyflow-api/end-user-api)をご確認ください。
{% endhint %}

## **TIPS : エンドユーザーでのトークン入力等を省く方法**

ソリューション内で自社プロダクトへのアクセスを行う場合、自社プロダクトのコネクタがまだAnyflow上に実装されていなければ、[HTTPアクション](/solution-editor/actions/api-call/http)で自社プロダクトに接続することができます。\
その際、エンドユーザーがウィザードで認証トークンの値を入力することが想定されます。

<figure><img src="https://files.readme.io/209c4c4-image.png" alt="" width="375"><figcaption></figcaption></figure>

しかし、自社プロダクトにログインしているエンドユーザーが、再度自社プロダクトの認証を行うのは手間に感じるかもしれません。

この場合、Tokenの値をエンドユーザー変数で取得するのではなく、My Event のペイロードに含めてしまえば、エンドユーザーの入力は不要になります。

<figure><img src="https://files.readme.io/abea818-image.png" alt=""><figcaption></figcaption></figure>

My Event は自社プロダクトの内部処理からリクエストできるため、tokenの存在をエンドユーザーが意識することなくソリューションを実行することが可能です。


# アクセストークンの発行

My Event エンドポイントなどの `/sdk` で始まるエンドポイントを使用するにはアクセストークンが必要です。

アクセストークンは、各エンドポイントの `Authorization` ヘッダーに `Bearer {アクセストークン}` の形で指定します。

## **アクセストークン発行 API**

**`POST https://for-product-api.anyflow.jp/sdk/token`**

アクセストークンを発行します。発行されるアクセストークンの有効期限は5分間です。アクセストークンの有効期限が切れた場合はもう一度発行してください。

アクセストークンの発行には一度アクセストークンの発行に使用した JWT は使用できません。常に新しい JWT を指定して下さい。

### **リクエスト**

JSON形式でリクエストを送信します。

<table><thead><tr><th width="239.5390625">キー</th><th>説明</th></tr></thead><tbody><tr><td>jwt</td><td>ソリューションを実行したいエンドユーザーを表す JWT を指定します。</td></tr><tr><td>env</td><td>ソリューションを実行したいエンドユーザーの所属するデプロイ環境を指定します。<br>デフォルトのデプロイ環境を使用する場合は指定不要です。</td></tr></tbody></table>

### **レスポンス**

<table><thead><tr><th width="240.16015625">キー</th><th>説明</th></tr></thead><tbody><tr><td>access_token</td><td>発行されたアクセストークンです。</td></tr></tbody></table>

{% hint style="success" %}

### ヒント

詳細な仕様は[ APIリファレンス](/anyflow-api/end-user-api) をご確認ください。
{% endhint %}

## **ウィザードホスティングの場合**

[ウィザードホスティング](/release/wizard-hosting)でソリューションを提供している場合、\
アクセストークンは画面の表示が切り替わるごとに自動で発行され、開発者コンソールから取得することが可能です。

自社プロダクト側でこのトークンを取得することは難しいため、検証目的として利用してください。

### **開発者コンソールからアクセストークンを取得する方法**<br>

1. ウィザードホスティングにアクセスします
2. 右クリックメニューから「検証」を選択します
3. 「Network」タブを選択します
4. 「Fetch/XHR」を選択します
5. 画面をリロードします
6. 「token」の項目を選択し、「Preview」を確認します
7. 右クリックし「Copy Value」で値をコピーするとアクセストークンを取得できます

<figure><img src="https://files.readme.io/aca50eb-image.png" alt=""><figcaption></figcaption></figure>

### **検証を何度か行う場合は**

アクセストークンは一度使用されるか、発行後10分経過すると失効してしまい、再度開発者コンソールから取得する必要があります。

そのため、検証を何度か行う場合は、通常通り[自身のコードでJWTを生成し](/release/embed/generate-jwt)アクセストークンを取得することを推奨します。

ただし、ウィザードホスティングでソリューションを提供している場合は、JWTのペイロードのいくつかの項目はウィザードホスティングにより既に決定しているため、それを一度だけ開発者コンソールから取得しておく必要があります。

1. トークンを取得した時と同様の手順でコンソールの「Fetch/XHR」を開きます
2. 「jwt」の項目の項目を選択し、「Preview」を確認します
3. 右クリックし「Copy Value」で値をコピーします

<figure><img src="https://files.readme.io/21239e6-image.png" alt=""><figcaption></figcaption></figure>

4. [jwt.io](https://jwt.io/)にアクセスし「Encoded」の欄に値をペーストします
5. 「Decoded」の欄から以下の値を取得します
   1. anyflow\_team\_id
   2. anyflow\_user\_id

<figure><img src="https://files.readme.io/20ac15e-image.png" alt=""><figcaption></figcaption></figure>

6. 通常通り[自身のコードでJWTを生成](/release/embed/generate-jwt) します。JWTのペイロードに含める値について、
   1. `anyflow_team_id,` `anyflow_user_id` は上記で取得した値を使います。
   2. `iss`は Anyflow CSチームから提供された値を使います。
   3. それ以外の値は任意の値を設定します。
7. 発行したJWTを使ってアクセストークンを取得します。


# Webhookトリガー

## **概要**

Webhookトリガーは、自社プロダクトや外部サービス（Salesforce, kintone など）でイベント（商談のステータスが変更された、新しいデータが書き込まれたなど）が実行された際、リアルタイムにソリューションを実行する仕組みです。

<table><thead><tr><th width="148.8828125">フィールド名</th><th>説明</th></tr></thead><tbody><tr><td>イベント名</td><td><p>Webhookトリガーがイベントを待機している名前です。イベント名は、生成されるWebhookアドレスの一部になります。Webhookアドレスはウィザードに配置することが可能で、エンドユーザーがコピーできます。</p><p>また、ことなるソリューション間で、Webhookトリガーのイベント名を同一に設定しておくことで、複数のソリューションを同時に実行することが可能です。</p></td></tr><tr><td>Webhookタイプ</td><td><p>ソリューションを発火するWebhookのタイプを選択します。GETリクエストの状態でPOSTやPUTなどの異なるタイプでWebhookを送信しても発火しません。</p><p>以下の一覧から選択可能です。</p><p>- GET request<br>- PUT/POST with unicode text data<br>- PUT/POST with JSON payload</p></td></tr><tr><td>ペイロード</td><td>Webhookで送信されてくるペイロードを定義します。<br>ここで定義した変数が後継のアクション等で変数として利用可能です。</td></tr><tr><td>ヘッダー</td><td>Webhookで送信されてくるHTTPのヘッダーを定義します。<br>ここで定義した変数が後継のアクション等で変数として利用可能です。</td></tr></tbody></table>

## **設定方法**

### **Webhookコネクタの設定**

Webhookコネクタの設定画面にて、Webhookのリクエスト元が定義しているヘッダーやペイロードを設定します。

手動でペイロードを登録するか、JSONで入稿するか２つの方法が存在します。

<figure><img src="https://files.readme.io/2debb70-payload_self.png" alt="1680" width="563"><figcaption><p>手動で追加する</p></figcaption></figure>

手動で追加することも可能ですが、大量のペイロードが送信されてくる場合は、JSONで入稿することを推奨します。

<figure><img src="https://files.readme.io/b765036-payload_json.png" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="https://files.readme.io/64327b4-payload_json_input.png" alt="1679" width="563"><figcaption><p>kintoneから送信されてくるWebhookペイロードを入稿した例</p></figcaption></figure>

### **Webhookタイプの設定**

<details>

<summary>GET request</summary>

リクエスト元のWebhook送信仕様が次のような場合は `GET request` を指定します。

```json
curl -G https://example.com/webhook \
     -H "Authorization: Bearer your_auth_token" \
     --data-urlencode "param1=value1" \
     --data-urlencode "param2=value2"
```

この場合、Webhookコネクタでの設定は以下の通りになります。

<figure><img src="https://files.readme.io/995cba5-image.png" alt="" width="563"><figcaption></figcaption></figure>

</details>

<details>

<summary>PUT/POST with unicode text data</summary>

リクエスト元のWebhook送信仕様が次のような場合は `PUT/POST with unicode text data` を指定します。

```
curl -X POST https://example.com/webhook \
     -H "Content-Type: text/csv" \
     -H "Authorization: Bearer your_auth_token" \
     --data-binary '@test.csv'
```

この場合、Webhookコネクタでの設定は以下の通りになります。

<figure><img src="https://files.readme.io/5b6513e-image.png" alt="" width="563"><figcaption></figcaption></figure>

送信されたテキストデータ（test.csv）はWebhookの出力値として「ペイロード」という変数に格納され、ソリューション内で使用することができます。

<figure><img src="https://files.readme.io/393418b-image.png" alt="ファイルとして使用する例"><figcaption><p>ファイルとして使用する例</p></figcaption></figure>

<figure><img src="https://files.readme.io/c82ed3c-_2024-03-01_11.58.32.png" alt="テキストとして使用する例"><figcaption><p>テキストとして使用する例</p></figcaption></figure>

</details>

<details>

<summary>PUT/POST with JSON payload</summary>

リクエスト元のWebhook送信仕様が次のような場合は `PUT/POST with JSON payload` を指定します。

```
curl -X POST https://example.com/webhook \
     -H "Content-Type: application/json" \
     -H "Authorization: Bearer your_auth_token" \
     -d '{"message": "Hello, World!"}'
```

この場合、Webhookコネクタでの設定は以下の通りになります。

<figure><img src="https://files.readme.io/075177c-image.png" alt="" width="563"><figcaption></figcaption></figure>

</details>

詳細な仕様は[WebhookのAPI仕様書](/anyflow-api/webhook)をご確認ください。

### **ウィザードの設定**

エンドユーザーが設定するためのWebhook URLをウィザードのスクリーンに配置するために、エンドユーザーの設定項目から、`Webhook URL`を任意のスクリーンに配置します。

<figure><img src="https://files.readme.io/66e5b5f-webhook.png" alt="" width="563"><figcaption></figcaption></figure>

プレビューではWebhook URLが `https://example.com/webhook` と表示されていますが、テストやAnyflow SDKで埋め込んだ際には、実際のWebhook URLが生成されます。

<figure><img src="https://files.readme.io/40a8949-webhook_url.png" alt="" width="563"><figcaption></figcaption></figure>

## **利用例**

### **kintoneでの例**

kintoneでは[Webhookをサポート](https://jp.cybozu.help/k/ja/user/app_settings/set_webhook/webhook.html)しているので、例として取り上げます。

以下のスクリーンショットは、kintoneでWebhookが送信された際にSlackに通知するシンプルなソリューションです。\
また、POSTされてくるペイロードに関してすべて手入力で入力するには時間がかかるので、[kintoneから送信されるペイロード](https://jp.cybozu.help/k/ja/user/app_settings/set_webhook/webhook_notification.html) のJSONをコピーし、ペイロードをJSONで入稿しています。

<figure><img src="https://files.readme.io/a9392a2-kintone_solution_1.png" alt="1680"><figcaption><p>PUT/POSTのJSONペイロードを受け取るように設定</p></figcaption></figure>

<figure><img src="https://files.readme.io/4d46905-kintone_solution_2.png" alt="1680"><figcaption><p>kintoneから送信されてくるWebhookのペイロードをいくつかSlackに通知するように設定</p></figcaption></figure>

以下のように、kintoneのヘルプページに従ってWebhookが送信されるように設定します。

<figure><img src="https://files.readme.io/be86004-kintone_webhook_setting.png" alt=""><figcaption></figcaption></figure>

ソリューションのテストを行い、Webhookの待機状態になったタイミングでkintoneでイベントが発火されるようにデータの追加や編集を行い、Anyflowでテストが完了することを確認します。

## **クラウドサインでの例**

クラウドサインでも[Webhookをサポート](https://help.cloudsign.jp/ja/articles/417935-webhook-%E6%A9%9F%E8%83%BD)しているので、例として取り上げます。

Anyflow上でコピーしたWebhook URLをクラウドサイン（コネクタ側）のWebhookの設定欄に登録します。

<figure><img src="https://files.readme.io/0017cff-webhook-url.png" alt="1440"><figcaption><p><code>Hook URL</code>にコピーしたWebhook URLを入力し、保存する</p></figcaption></figure>

ソリューションのテストを行い、Webhookの待機状態になったタイミングでイベントが発火されるようにデータの追加や編集を行い、Anyflowでテストが完了することを確認します。


# Request / My Event / Webhook トリガーの違い

以下の3つのトリガーは、いずれもAnyflowのAPIエンドポイントを呼び出すことで実行されるトリガーです。\
それぞれの違いは、表にまとめると以下の通りです。

<table data-header-hidden><thead><tr><th></th><th width="109.33984375"></th><th></th><th></th><th></th><th></th><th></th><th></th></tr></thead><tbody><tr><td>アプリ名</td><td>リクエスト<br>検証</td><td>ユーザー<br>負荷</td><td>レスポンス</td><td>実行<br>ソリューション</td><td>呼出元</td><td>Method</td><td>Content-Type</td></tr><tr><td><a href="/pages/I3zDepCphMuM2vieTFi3">Request and Response</a></td><td>○</td><td>○</td><td>○</td><td>1つ</td><td>自社プロダクト<br>のサーバー</td><td>POST</td><td>application/json</td></tr><tr><td><a href="/pages/9JRU8nNYkjL7S8PDTNJ8">My Event</a></td><td>○</td><td>○</td><td>✗</td><td>複数</td><td>自社プロダクトのサーバー or<br>フロント</td><td>POST</td><td>application/json</td></tr><tr><td><a href="/pages/eS1wgRybhMCg4CfdNC8X">Webhook</a></td><td>✗</td><td>△</td><td>✗</td><td>1つ</td><td>自社プロダクト<br>or 外部SaaSのWebhook機能</td><td>GET<br>POST</td><td>application/json<br>text/csv</td></tr></tbody></table>

## **リクエスト検証**

○：アクセストークンを用いて動的な検証を行うことができます。\
✗：動的な検証を行うことはできません。

## **ユーザー負荷**

○：エンドユーザーはソリューションをインストールするだけで済みます。\
△：エンドユーザーはソリューションのインストールに加えて、Webhook URL を自社プロダクトまたは外部SaaSのWebhook設定画面に入稿しなければいけません。

## **レスポンス**

○：呼出に対して、ソリューションの処理内容をレスポンスとして受け取ることができます。\
✗：呼出が正しいかどうかのレスポンスのみが返却されます。

## **実行ソリューション**

1つ：1回の呼出で実行できるソリューションは1つだけです。\
複数：エンドユーザーが複数のソリューションをインストールしていれば、1回の呼出で複数のソリューションを実行できます。

## **呼出元**

Requestトリガーは、レスポンス内容を自社DB等に格納する想定で、サーバーでの呼び出しに限定しています。\
My Eventトリガーは、サーバーからもフロントエンドからも呼び出すことも可能です。\
Webhookトリガーは、自社プロダクトまたは外部SaaSにWebhookが存在する場合に呼び出すことが可能です。

## **Method, Content-Type**

APIの呼出で使うことのできるMethodとContent-Typeです。


# 外部プロダクト起点

外部プロダクトを起点にして連携を実行するトリガー


# ポーリングトリガー

トリガーの種類のうち、ポーリングについて

<figure><img src="https://files.readme.io/0972156-image.png" alt="例：カラーミーショップのポーリングトリガー"><figcaption><p>例：カラーミーショップのポーリングトリガー</p></figcaption></figure>

## **概要**

ポーリングトリガーは、新しいイベントが利用可能かどうかを定期的に連携先SaaSに問い合わせることで、新しいイベントの有無を確認します。ポーリングの頻度は最小で5分程度にすることが可能です。

ソリューションが最初に開始される際に、ポーリングトリガーは直近のイベントを取得します。\
エンドユーザーがソリューションを有効にしている間、ソリューションエディターで設定したポーリング間隔に沿って定期的にイベントを取得し、新規でイベントが存在する場合にトリガーが発火します。

<figure><img src="https://files.readme.io/b865cc1-Document_-_.jpg" alt="1912" width="600"><figcaption><p>ポーリングトリガーの動作イメージ</p></figcaption></figure>

{% hint style="warning" %}

### ポーリングの上限

一回のポーリングで取得するレコード数は`100件程度`に収めることを推奨しています。\
[ソリューション実行の上限値](/ops/step-execution-limit)も併せてご確認ください。
{% endhint %}

## **ポーリングトリガーの種類**

ポーリングトリガーには以下の二種類が存在します。

* 通常のポーリングトリガー
* カスタムポーリングトリガー

### **通常のポーリングトリガー** <a href="#normal-polling-triggers" id="normal-polling-triggers"></a>

通常のポーリングトリガーは、「〜された際に実行」「〜になったら実行」という形式で表記されています。

<figure><img src="https://files.readme.io/a8f3b2b-image.png" alt=""><figcaption></figcaption></figure>

この場合は、ポーリング間隔などの設定を行うだけで簡単に実行することができます。

<figure><img src="https://files.readme.io/872e664-image.png" alt=""><figcaption></figcaption></figure>

### **カスタムポーリングトリガー(β)** <a href="#custom-polling-triggers" id="custom-polling-triggers"></a>

カスタムポーリングトリガーは、上記とは異なりHTTPリクエストの内容を独自に定義して実行するトリガーです。

<figure><img src="https://files.readme.io/44199b4-image.png" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}

### 検証用途でご使用ください

カスタムポーリングトリガーは検証用途で提供しており、本番のソリューションに適用するのは推奨しておりません。

カスタムポーリングトリガーは独自の内容を設定できる反面、設定内容によっては意図せぬ形でトリガーが大量に発火したり、エラーが継続的に発生し続ける可能性があるためです。

必要であればAnyflow CSチームとも相談のうえ検討を行ってください。
{% endhint %}

{% hint style="warning" %}

### カスタムポーリングトリガー固有の上限値について

カスタムポーリングトリガーが1回のポーリングで処理できるレコード件数は`100件まで`と明示的に制限されています。
{% endhint %}


# リアルタイムトリガー

トリガーの種類のうち、リアルタイムについて

<figure><img src="https://files.readme.io/e040d06-image.png" alt="例：DocuSignのリアルタイムトリガー"><figcaption><p>例：DocuSignのリアルタイムトリガー</p></figcaption></figure>

リアルタイムトリガーは通常、Webhook経由で発火するトリガーです。\
Webhookの利点は、トリガーの発火までの遅延が少ないことです。\
Anyflowが一定間隔で新しいイベントをチェックする必要がなく、イベントが発生したときにアプリからリアルタイムで通知を受け取るため、効率的です。


# スケジューラートリガー

スケジューラートリガーの設定方法について

## **概要**

スケジューラーはAnyflowの標準アプリで、エンドユーザーによって事前に定義された時間間隔でソリューションを実行可能です。

## **指定された日時でスケジュール実行**

スケジューラートリガーの「指定された日時でスケジュール実行」を選択します。

## **入力フィールド**

<table><thead><tr><th width="208.7109375">フィールド名</th><th>設定</th><th>説明</th></tr></thead><tbody><tr><td>時間単位</td><td>必須</td><td><p>カスタムスケジュールを選択します。</p><p>- カスタムスケジュール:cron式を使用することにより複雑な時間間隔を指定可能です。</p></td></tr><tr><td>cron式</td><td>必須</td><td>cron式でカスタムスケジュールを設定することが可能です。<br>cron式の詳細については、使い方のセクションをご確認ください。</td></tr></tbody></table>

## **使い方**

### **時間単位を指定する**

`カスタムスケジュール` を選択します。

<figure><img src="https://files.readme.io/5498e15-unit-of-time.png" alt="1440"><figcaption><p>時間単位を指定します</p></figcaption></figure>

{% hint style="success" %}
現状は、カスタムスケジュールのみに対応しています。
{% endhint %}

### **cron式でカスタムスケジュールを設定する**

時間単位で`カスタムスケジュール`を選択します。

<figure><img src="https://files.readme.io/eb42cb4-custom-schedule.png" alt="1440"><figcaption><p><code>カスタムスケジュール</code>を選択します</p></figcaption></figure>

#### **cron式の書き方について**

cron式は固定された順序の構文に従います。\
`[分] [時] [日] [月] [曜日]`

すべての要素を定義する必要があり、空白にすることはできません。\
ワイルドカード（例: `*` `,` `-` など）を使用し、設定します。\
cron式の詳細については、[こちら](https://crontab.guru/)をご確認ください。

#### **cron式の例**

| cron式           | 例                  |
| --------------- | ------------------ |
| `0 0 * * *`     | 毎日`00時00分`         |
| `*/10 * * * *`  | 10分ごと              |
| `0 0 1 * *`     | 毎月1日の`00時00分`      |
| `0 0 L * *`     | 毎月最終日の`00時00分`     |
| `0 0 * * 1,5`   | 毎週月曜日と金曜日の`00時00分` |
| `0,30 * * * *`  | 1時間に2回、`00分`と`30分` |
| `0 9 * * MON#1` | 毎月第1月曜日の`09時00分`   |

#### **cron式を入力する**

`cron式`に直接入力し、設定します。

<figure><img src="https://files.readme.io/341edcc-cron.png" alt="1440"><figcaption><p>cron式を入力します</p></figcaption></figure>

## デプロイ時の注意点

デプロイ中のソリューションに紐付くスケジューラートリガーは、バージョンアップのための**デプロイ中は発火しません**。\
デプロイの開始タイミングによっては、**スケジューラートリガーの実行がスキップされる**場合があります（添付画像のように、6ヶ月目の実行タイミングとデプロイタイミングが重なるケースなどが該当します）

<figure><img src="/files/tpCGNzl9LTc5k77gHGTA" alt="" width="375"><figcaption></figcaption></figure>

バージョンアップデートでデプロイを行う際は、十分にご注意ください。

**＜注意が必要なケース＞**

* **間隔が短いスケジューラートリガーをご利用の場合**
* **デプロイのタイミングがスケジューラートリガーの実行時刻と重なりやすい場合**
* **スケジュールがスキップされた際にデータ欠損などが起こる場合**


# トリガー条件

## **概要**

トリガー条件とは、どのようなトリガーイベントを選択して処理するかを定義する追加のルールです。\
例えば、GoogleDriveの `フォルダにファイル/フォルダが新規作成された際に実行` トリガーで、フォルダが作成された際にはトリガーさせない、といった追加のルールを設定することができます。

<figure><img src="https://files.readme.io/2b951bd-trigger_rule.png" alt="674" width="563"><figcaption><p>is folder が Falseと等しい（ファイルである）場合、トリガーしない設定の例</p></figcaption></figure>

トリガー条件は、トリガーイベントが取得された後にAnyflowによって評価されます。\
トリガー条件に合致する場合のみ、ソリューションが実行されます。トリガー条件に合致しない場合はソリューションは実行されません。

## **トリガー条件の追加**

トリガー条件を追加するには、右ペインのトリガー条件の「+」ボタンを押下し、AND か OR で条件を追加することができます。

<figure><img src="https://files.readme.io/a2b4086-add_trigger_rule.png" alt="" width="563"><figcaption></figcaption></figure>


# アクション

アクションは、アプリの操作（例: 作成、更新、検索など）を実行するものです。

各アクションは、一連の入力フィールドを必要とし、通常は変数を返します。

例えば以下のスクリーンショットのステップでは、GoogleDrive の `ファイルをアップロード` アクションを実行します。\
右側は、GoogleDrive の`ファイルをアップロード` アクションで利用可能な入力フィールドを示しています。

<figure><img src="https://files.readme.io/c9c12a8-google_drive_upload_action.png" alt=""><figcaption></figcaption></figure>

`ファイルをアップロード` アクションを実行すると、左側に表示されている変数ウィンドウに、`ファイルをアップロード` アクションが実行された結果のデータを返し、後継のステップで利用できる状態になります。


# APIの呼び出し


# 専用アクション

## **概要**

専用アクションとは、Anyflow Embed が用意したアクションです。

専用アクションを使用することにより、実行したい操作を選択して入力フィールドを設定するだけで利用することが可能です。

アクションのリクエストやレスポンスは Anyflow Embed があらかじめ定義しているため、各コネクタの API ドキュメントを確認する必要はありません。

設定する入力フィールドはアクションごとに異なります。個別のアクションの入力フィールドについては、ソリューションエディタのアクション選択画面をご確認ください。

利用したい操作が専用アクションに存在しない場合は、 [カスタムアクション](/solution-editor/actions/api-call/custom)または [HTTPアクション](/solution-editor/actions/api-call/http)をご利用ください。

## 専用アクションの一例

HubSpotのコネクタには、以下のような専用アクションが存在します。

* 企業情報を一括作成
* 企業情報を作成
* コンタクトを作成
* コンタクトを一括作成
* etc...

<figure><img src="/files/pQISEY4LG20ojKB2ooL0" alt="" width="365"><figcaption></figcaption></figure>

{% hint style="success" %}
専用アクションは随時追加をしております。専用アクションの追加を希望される場合はAnyflow CS担当者までお問い合わせください。
{% endhint %}


# カスタムアクション

カスタムアクションの設定方法について

## **概要**

カスタムアクションとは、Anyflow Embed に備わっていないアクションを HTTP リクエストを経由することによって利用可能にするアクションです。

カスタムアクションを使用することにより、ゼロから何かを構築するのではなく、既存コネクタのフレームワークを使って新しいアクションを構築することが可能です。

各コネクタの API ドキュメントからアクションのリクエストとレスポンスを取得し、それがどのようなものかを Anyflow Embed に伝えることで、簡単にアクションを構築することが可能です。

***

## **コネクタサポート**

Anyflow Embed のほとんどのコネクタはカスタムアクションをサポートしています。（各コネクタ随時開発中です）\
カスタムアクションは、コネクタのアクション選択リストから選択可能です。

<figure><img src="https://files.readme.io/afff7e7-CustomAction1.png" alt="574"><figcaption><p>例: SlackBot アクションのカスタムアクション選択画面</p></figcaption></figure>

また、カスタムアクションで使用可能なスコープを表示しています。\
通常、スコープが必要な API のみ操作可能です。\
例えば、 SlackBot のカスタムアクションを選択すると、以下のスコープのみ使用可能です。

<figure><img src="https://files.readme.io/9a039d6-CustomAction2.png" alt="575"><figcaption><p>カスタムアクションで使用できるコネクタのスコープ一覧</p></figcaption></figure>

{% hint style="success" %}

### スコープとは？

API をコールするために必要な権限です。\
Anyflow Embed の操作画面（Help）に明記されているスコープを使用可能です。

スコープを変更したい場合は[OAuth画面をカスタムする](/connectors/custom-oauth-client)の方法を参考にしてください。
{% endhint %}

***

## **カスタムアクションの入力フィールド**

カスタムアクションの設定入力フィールドの詳細について説明します。

<table><thead><tr><th width="167.91796875"></th><th></th></tr></thead><tbody><tr><td><strong>入力フィールド</strong></td><td><strong>説明</strong></td></tr><tr><td>カスタムアクション名</td><td>作成するカスタムアクションに名前を付けます。</td></tr><tr><td>HTTPメソッド</td><td>呼び出す API エンドポイントの HTTP メソッドです。</td></tr><tr><td>リクエストパス</td><td>入力したURLは、ベースURLの末尾に追加されます。<br>例:SlackアクションのベースURLは、<a href="https://slack.com/api">https://slack.com/api</a> なので、ここで <code>/conversations.members</code> という値を使用すると、リクエストは <a href="https://slack.com/api/conversations.members">https://slack.com/api/conversations.members</a> に送信されます。</td></tr><tr><td>リクエストURLパラメーター</td><td>URL パラメーターを渡すことが可能です。</td></tr><tr><td>リクエストタイプ</td><td>JSON リクエストを渡すことが可能です。</td></tr><tr><td>レスポンスタイプ</td><td>API が返すと期待される出力スキーマを Anyflow Embed に説明します。これは、出力値のデータツリーを生成するために使用します。</td></tr></tbody></table>

## GraphQLの場合のリクエスト方法

カスタムアクションを利用してGraphQLのリクエストも可能です。

名前「query」でString型のスキーマを作成し、値としてクエリ内容を入力してください。

<figure><img src="/files/amEXKDgANtFZR0GKu1NS" alt="" width="563"><figcaption></figcaption></figure>

***

## **利用例**

* [レシピ | Slack チャンネルのメンバー情報一覧を取得する](/recipe/communication/slackbot-custom-get-member)
* [レシピ | Slack チャンネルにファイルをアップロードする](/recipe/communication/slackbot-custom-upload-file)


# HTTP/認証付きHTTPアクション

{% hint style="warning" %}
HTTP コネクタと認証付きHTTP コネクタの違いは認証方法のみで、「リクエストを送信」アクションの入力フィールドと動作は同じです。

以降の説明とスクリーンショットは HTTP コネクタを例にしています。
{% endhint %}

## **概要**

HTTP コネクタは任意のエンドポイントに対して HTTP リクエストを送信できるコネクタです。Anyflow Embed がコネクタとして提供していない外部ツールの API を呼び出したい場合に利用します。

HTTP コネクタは、Anyflow Embed のほとんどのコネクタでサポートされているカスタムアクションを特定のコネクタに縛られることなく、柔軟に利用できるようにしたものです。

専用のコネクタが存在し、その認証をそのまま使いたい場合は、HTTP コネクタではなくカスタムアクションをご利用ください。[カスタムアクション](/solution-editor/actions/api-call/custom)のドキュメントも必要に応じて参照ください。

***

## **HTTP コネクタで利用可能なアクション**

HTTP コネクタでは、現在以下のアクションを利用可能です。

* リクエストを送信
  * HTTP リクエストで独自のアクションを構築します。

***

## **「リクエストを送信」アクションの入力フィールド**

HTTPリクエストの設定入力フィールドの詳細について説明します。

<table><thead><tr><th width="234.99609375"></th><th></th></tr></thead><tbody><tr><td><strong>入力フィールド</strong></td><td><strong>説明</strong></td></tr><tr><td>表示名</td><td>作成するアクションに名前をつけます。</td></tr><tr><td>HTTPメソッド</td><td>呼び出す API エンドポイントの HTTP メソッドです。</td></tr><tr><td>リクエストURI</td><td>呼び出す API エンドポイントの URI です。</td></tr><tr><td>リクエストURLパラメーター</td><td>URL パラメーターを渡すことが可能です。</td></tr><tr><td>リクエストヘッダー</td><td>HTTP リクエストヘッダーを指定できます。</td></tr><tr><td>リクエストタイプ</td><td>HTTP リクエストタイプを指定できます。</td></tr><tr><td>レスポンスヘッダー定義</td><td>API が返すと期待される HTTP レスポンスヘッダーを Anyflow Embed に説明します。これは出力値のデータツリーを生成するために使用します。</td></tr><tr><td>レスポンスタイプ</td><td>API が返すと期待される出力スキーマを Anyflow Embed に説明します。これは、出力値のデータツリーを生成するために使用します。</td></tr><tr><td>レスポンスボディ定義</td><td>API が返すレスポンスをソリューション内で利用したいフィールドを定義します。</td></tr><tr><td>タイムアウト値</td><td>接続先（外部API）からの応答を待つ最大時間です。未指定時のデフォルトは<code>180秒</code>です。処理に時間のかかるAPIでタイムアウトエラーになる場合に指定します。最大値は<code>600秒</code>です。</td></tr></tbody></table>

## **レスポンスタイプの違い**

<figure><img src="https://files.readme.io/deab66c-image.png" alt=""><figcaption></figcaption></figure>

* json：多くの場合はこちらを選択します。レスポンスはAnyflowによりツリー構造として解釈され、ソリューション内で利用できます。
* raw：レスポンスとしてファイルが返却されるAPIなどで、レスポンスがツリー構造ではない場合やAnyflowとしての解釈が不要な場合はこちらを選択します。デフォルトでは、rawのレスポンスは`文字列型`の変数に格納されます。

<figure><img src="https://files.readme.io/e4793c4-image.png" alt="" width="375"><figcaption></figcaption></figure>

{% hint style="success" %}

### ヒント

rawのレスポンス実態が文字列ではない場合、は[変数アクション](/solution-editor/actions/data-transform/variable)を使って適切な型の変数を作成し、そこにrawのレスポンスを格納することで、ソリューション内で正しく扱うことができます。
{% endhint %}

<figure><img src="https://files.readme.io/fca13f6-image.png" alt="例：rawの実態がFile型なので、File型の変数に格納する" width="563"><figcaption><p>例：rawの実態がFile型なので、File型の変数に格納する</p></figcaption></figure>

***

## **利用例**

### **Slack チャンネルのメンバー情報一覧を取得する「リクエストを送信」アクション例**

Slack チャンネルに参加しているメンバーの一覧を取得する「リクエストを送信」アクションを構築してみましょう。

{% hint style="success" %}

### ヒント

この例では独自のSlackBotを作成したうえで、そのBotのTokenを使ってAPIを呼び出します。\
独自のSlackBotを用意されていない方は[こちら](/recipe/communication/slackbot-custom-original-bot)を参照してください。
{% endhint %}

選択したアクションに名前を付けます。\
今回は「メンバー一覧取得」というカスタムアクション名を入力します。\
この名前は、アクション名の下部分に表示されます。

<figure><img src="https://files.readme.io/1b7c812-CleanShot_2023-11-11_at_11.22.47.gif" alt=""><figcaption></figcaption></figure>

呼び出す API のエンドポイントに基づいて、リクエストの HTTP メソッドを選択します。\
Slack API のドキュメントを確認すると、HTTP メソッドが記載されています。\
今回の場合、`conversations.members`がGET メソッドを使用することを示しています。

<figure><img src="https://files.readme.io/a938ace-CustomAction5.png" alt="1439"><figcaption><p>Slack APIドキュメント:conversations.members</p></figcaption></figure>

HTTP メソッドを選択すると、アクションに関連する入力フィールドが表示されます。

<figure><img src="https://files.readme.io/64b07c1-CleanShot_2023-11-11_at_11.39.39.gif" alt=""><figcaption></figcaption></figure>

リクエスト URI には`https://slack.com/api/conversations.members`と入力します。

<figure><img src="https://files.readme.io/aae1894-CleanShot_2023-11-11_at_11.42.422x.png" alt="&#x60;conversations.members&#x60; のURLエンドポイントを追加します"><figcaption><p><code>conversations.members</code> の URL エンドポイントを追加します</p></figcaption></figure>

送信するリクエストを定義します。\
この API エンドポイントでは、`token`の他に`channel`をパラメーターとして渡す必要があります。

<figure><img src="https://files.readme.io/4d6587c-CustomAction8.png" alt="734"><figcaption><p>Slack APIドキュメント:conversations.membersのArguments</p></figcaption></figure>

リクエスト URL パラメーターを設定します。

<figure><img src="https://files.readme.io/5a89cf4-CleanShot_2023-11-14_at_23.21.302x.png" alt="キーと値を入力します。"><figcaption><p>キーと値を入力します。</p></figcaption></figure>

リクエストヘッダーに Slack Botの認証トークンを設定します。

Slack Bot の認証トークンはSlackBotの`OAuth Tokens`の項目から取得できます。

<figure><img src="https://files.readme.io/bf6aa6f04edf163a6b8848973e0a1ec5cfa79af415c6b4e0e26cd157da793051-image.png" alt=""><figcaption></figcaption></figure>

取得したトークンをヘッダーに設定します。

<figure><img src="https://files.readme.io/9434972-CleanShot_2023-11-14_at_23.24.132x.png" alt="キーと値を入力します。"><figcaption><p>キーと値を入力します。</p></figcaption></figure>

レスポンスタイプを選択します。\
選択後、レスポンスボディを定義する入力フィールドが表示されます。

<figure><img src="https://files.readme.io/cb4bdf9-CleanShot_2023-11-14_at_23.26.462x.png" alt="レスポンスタイプを選択すると、入力フィールドが表示されます。"><figcaption><p>レスポンスタイプを選択すると、入力フィールドが表示されます。</p></figcaption></figure>

レスポンスボディを定義します。\
まず、 Slack API のドキュメントにて、どんなレスポンス構造になっているかを確認します。

<figure><img src="https://files.readme.io/eda48d0-CustomAction12.png" alt="734"><figcaption><p>Slack APIドキュメント:conversations.membersのExample responses</p></figcaption></figure>

次に、Common successful response のJSON をコピーし、Anyflow Embed で「JSONで追加」を選択します。

<figure><img src="https://files.readme.io/cb401af-image.png" alt="「JSONで追加」のモーダル"><figcaption><p>「JSONで追加」のモーダル</p></figcaption></figure>

<figure><img src="https://files.readme.io/2c5362d-image.png" alt="「JSONで追加」を行った後の状態"><figcaption><p>「JSONで追加」を行った後の状態</p></figcaption></figure>

{% hint style="warning" %}

### 定義する項目について

後続の処理の中で使用したい項目のみを定義します。\
ドキュメントに明記されている項目を全て定義する必要はありません。\
ここで定義した項目は、後続の処理で利用可能です。
{% endhint %}

これでHTTP コネクタの「リクエストを送信」アクションが完成したので、テスト実行をしてみましょう。\
トリガーなしでアクションを迅速にテストしたい場合は、Click トリガーを使用してテストします。

上記アクションをテスト実行した際、アクションに渡された入力をテスト履歴から確認可能です。

<figure><img src="https://files.readme.io/7514ca6-CleanShot_2023-11-14_at_23.39.312x.png" alt="テスト履歴: 入力値"><figcaption><p>テスト履歴: 入力値</p></figcaption></figure>

また、Slack APIから返された詳細な出力値を確認し、APIコールが成功したかがどうか確認可能です。

<figure><img src="https://files.readme.io/72d061f-CleanShot_2023-11-14_at_23.40.572x.png" alt=":テスト履歴: 出力値"><figcaption><p>テスト履歴: 出力値</p></figcaption></figure>

こちらの呼び出しは成功したようです。


# データの変換


# Pythonアクション

{% hint style="success" %}
デフォルトではこの機能はOFFになっています。

利用する場合はAnyflow CS担当者までお問い合わせください。
{% endhint %}

## 概要

Pythonコードを記述することができるアクションです。

[formula](/solution-editor/common-specs/formula) ではPythonの内包表記（ワンライナー）のみをサポートしているのに対し、\
Pythonアクションでは内包表記に限らず複数行のPythonコードを記述することができます。

<figure><img src="https://files.readme.io/d69940d88d897445258b860df15db9afe91019a44eab3ffc604070dbbff414cd-image.png" alt=""><figcaption></figcaption></figure>

## 使い方

Pythonアクションでは`def main(inputs):`の形式で定義される**main関数**を実行することができます。

main関数では**引数（inputs）**&#x3068;してオブジェクトや配列などの構造体を渡すことができます。

![](https://files.readme.io/b312a553f8d3881dca436111ee79365543a6d1fc34e725b18b157431a63fe791-image.png)![](https://files.readme.io/db0dca8fb0d1ffb308d3c97df5ca497537f60b427255e79591d81636d37268fb-image.png)<br>

main関数での処理結果は**戻り値**として return できます。

![](https://files.readme.io/ca08e0e46e5b8754600c6dbcb9c81cff70b819703300728f96c237c373badfe0-image.png)![](https://files.readme.io/6194315824d4276aa4eb68ad6c4d86180c0b43e1a7eb9047f31f42241ff508a1-image.png)

引数と戻り値のスキーマはそれぞれ事前に定義しておく必要があります。\
ただしオブジェクトの中身までは定義する必要はありません。

## 使用可能な記法

{% hint style="success" %}
Pythonアクションでは、以下に示すformulaと同様の記法と、`print()` を使用することができます。

セキュリティの関係上、`import` は使用できません。
{% endhint %}

<details>

<summary>基本定数</summary>

* `None`：null（値が存在しない）を示す定数
* `True` / `False`：真または偽を表す真偽値定数

</details>

<details>

<summary>型変換</summary>

* `bool(x)`：真偽値に変換する
* `str(x)`：文字列に変換する
* `int(x)`：整数に変換する
* `float(x)`：浮動小数点数に変換する
* `chr(x)`：Unicodeコードを文字に変換
* `ord(x)`：文字をUnicodeコードに変換
* `hex(x)`：16進数文字列に変換
* `oct(x)`：8進数文字列に変換
* `json_dumps(obj)`：オブジェクトをJSON形式の文字列に変換
* `json_loads(str)`：JSON文字列をオブジェクトに変換

</details>

<details>

<summary>数字</summary>

* `abs(x)`：x の絶対値を返す
* `max(iterable)`：最大値を返す
* `min(iterable)`：最小値を返す
* `sum(iterable)`：合計値を返す
* `pow(x, y)`：x の y 乗を返す
* `round(x)`：x を四捨五入して返す
* `floor(x)`：x を切り捨てる（小数点以下切り捨て）
* `ceil(x)`：x を切り上げる（小数点以下切り上げ）
* `all(iterable)`：すべての要素が真なら True を返す
* `any(iterable)`：いずれかの要素が真なら True を返す

</details>

<details>

<summary>文字列</summary>

#### 関数

* `re.search(pattern, string)`：正規表現で部分一致検索
* `re.sub(pattern, repl, string)`：正規表現による文字列置換
* `zenkaku_to_hankaku(str)`：【Anyflow独自関数】 全角文字を半角に変換
* `hankaku_to_zenkaku(str)`：【Anyflow独自関数】 半角文字を全角に変換

#### 大文字・小文字変換メソッド

* `.lower()`：すべて小文字に変換
* `.upper()`：すべて大文字に変換
* `.capitalize()`：先頭のみ大文字、他は小文字に変換
* `.title()`：各単語の先頭を大文字に
* `.swapcase()`：大文字と小文字を反転
* `.casefold()`：比較用の小文字変換（より厳密）

#### 配置・埋め込みメソッド

* `.center(width)`：中央寄せで文字列を埋める
* `.ljust(width)`：左寄せで埋める
* `.rjust(width)`：右寄せで埋める
* `.zfill(width)`：左側をゼロで埋める

#### 検索・位置取得メソッド

* `.find(sub)`：部分文字列の位置（見つからなければ -1）
* `.rfind(sub)`：右から検索
* `.index(sub)`：見つからなければエラー
* `.rindex(sub)`：右からの位置（エラー有）
* `.count(sub)`：出現回数

#### 判定系メソッド

* `.startswith(prefix)`：指定文字で始まるか
* `.endswith(suffix)`：指定文字で終わるか
* `.isalnum()`：英数字かどうか
* `.isalpha()`：アルファベットかどうか
* `.isascii()`：ASCII 文字かどうか
* `.isdecimal()`：10進数字か
* `.isnumeric()`：数値文字か
* `.isspace()`：空白のみか
* `.islower()`：すべて小文字か
* `.isupper()`：すべて大文字か
* `.istitle()`：タイトル形式か

#### 分割・結合メソッド

* `.split(sep)`：区切りで分割
* `.rsplit(sep)`：右から分割
* `.splitlines()`：改行で分割
* `.partition(sep)`：最初の区切りで3つに分割
* `.rpartition(sep)`：右からの区切りで分割
* `"sep".join(iterable)`：文字列のリストを結合

#### 変更・整形メソッド

* `.replace(old, new)`：文字列の置換
* `.strip(chars)`：前後の指定文字を削除
* `.lstrip(chars)`：左端を削除
* `.rstrip(chars)`：右端を削除
* `.expandtabs(n)`：タブをスペースに変換

</details>

<details>

<summary>配列・辞書</summary>

* `len(x)`：要素数を返す
* `list(x)`：リストに変換する
* `dict(x)`：辞書に変換する
* `tuple(x)`：タプルに変換する
* `set(x)`：集合に変換する（重複を削除）
* `zip(a, b)`：複数の配列を要素ごとに結合
* `enumerate(x)`：インデックスと要素のペアを生成
* `range(n)`：整数の範囲を生成（0 から n-1 まで）
* `sorted(x)`：並び替えたリストを返す
* `groupby(iterable)`：【Anyflow独自関数】 指定キーでグループ化
* `get_first(list)`：【Anyflow独自関数】 リストの先頭要素を返す

</details>

<details>

<summary>日付・時間</summary>

#### 関数

* `str_to_date(str)`：【Anyflow独自関数】 文字列を日付型に変換
* `str_to_datetime(str)`：【Anyflow独自関数】 文字列を日時型に変換
* `utcnow()`：【Anyflow独自関数】 UTC 現在時刻を返す
* `jstnow()`：【Anyflow独自関数】 日本時間の現在時刻を返す

#### メソッド

* `.add(**kwargs)`：指定した時間を加算（例：`add(days=3)`）
* `.subtract(**kwargs)`：指定した時間を減算
* `.start_of("unit")`：指定単位（"day", "month" 等）の開始時刻を取得
* `.end_of("unit")`：指定単位の終了時刻を取得
* `.format(format_string)`：指定書式で文字列に変換
* `.isoformat()`：ISO 8601 形式で出力
* `.is_future()`：未来の日付かどうか判定
* `.is_past()`：過去の日付かどうか判定
* `.weekday()`：曜日を数値（0〜6）で返す
* `.in_timezone("Asia/Tokyo")`：タイムゾーンを変換
* `.is_dst()`：夏時間かどうか判定
* `.is_utc()`：UTCかどうか判定

#### 共通属性（日時・日付どちらでも使用可能）

* `.day`：日（1〜31）
* `.month`：月（1〜12）
* `.year`：年（例：2025）
* `.quarter`：四半期（1〜4）
* `.day_of_week`：曜日（0=月曜日, 6=日曜日）
* `.day_of_year`：年初からの日数（1〜366）
* `.week_of_month`：月の週番号（1〜5程度）
* `.week_of_year`：年の週番号（ISO 8601形式：1〜53）
* `.days_in_month`：その月の日数（28〜31）

#### 時間属性（日時オブジェクトのみ使用可能）

* `.hour`：時（0〜23）
* `.minute`：分（0〜59）
* `.second`：秒（0〜59）
* `.microsecond`：マイクロ秒（0〜999999）
* `.int_timestamp`：UNIXタイムスタンプ（整数）
* `.float_timestamp`：UNIXタイムスタンプ（小数点付き）
* `.offset`：UTCからの秒単位オフセット（例：+32400秒）
* `.offset_hours`：UTCからの時間単位オフセット（例：+9.0）
* `.timezone_name`：タイムゾーン名（例：`"Asia/Tokyo"`）

</details>

<details>

<summary>エンコーディング・暗号化</summary>

#### 関数

* `b64encode(str)`：【Anyflow独自関数】 Base64 で文字列をエンコード
* `b64decode(str)`：【Anyflow独自関数】 Base64 でデコード
* `quote(str)`：【Anyflow独自関数】 URLエンコード
* `unquote(str)`：【Anyflow独自関数】 URLデコード
* `hmac.new(key, msg, digestmod)`：HMAC署名を作成

#### メソッド

* `.encode()`：文字列をバイト列に変換
* `.decode()`：バイト列を文字列に変換

</details>

<details>

<summary>CSV</summary>

#### 関数

* `csv.reader(csvfile, delimite, quotechar, quoting)`：CSVリーダーオブジェクトを返す（イテレータ形式、全行取得には.to\_list()を使用）
* `csv.DictReader(csvfile, fieldnames, delimiter, quotechar, quoting)`：CSVの各行を辞書となっている、CSV DictReaderオブジェクトを返す（イテレータ形式、全行取得には.to\_list()を使用）
* `csv.Sniffer().sniff(sample, delimiters)`：与えられたサンプル文字列から、区切り文字や引用符などの CSV フォーマットを推定する。
* `csv.field_size_limit()`：フィールドの最大サイズ制限を取得する（読み取り専用）

#### 定数

* `csv.QUOTE_ALL`：すべてのフィールドを引用符で囲む
* `csv.QUOTE_MINIMAL`：必要な場合のみ引用符で囲む（デフォルト）
* `csv.QUOTE_NONE`：引用符を一切使用しない
* `csv.QUOTE_NONNUMERIC`：数値以外のフィールドを引用符で囲み、読み込み時は数値に変換

#### クラス・ダイアレクト

* `csv.Error`：CSVパースエラー時に送出される例外クラス
* `csv.excel`：Excel形式に対応したダイアレクト（区切り文字はカンマ）
* `csv.excel_tab`：Excelのタブ区切り形式に対応したダイアレクト
* `csv.unix_dialect`：UNIXスタイルのCSV形式に対応したダイアレクト（カンマ区切り、ダブルクオート引用）

</details>

<details>

<summary>その他</summary>

* `condition(condition, true_value, false_value)`：【Anyflow独自関数】 条件式に応じた値を返す（三項演算子）

</details>

## パフォーマンス仕様

※いずれも1回のアクション実行ごとの値です

<table><thead><tr><th width="221.140625">項目</th><th width="141.11328125">値</th><th>説明</th></tr></thead><tbody><tr><td>タイムアウト</td><td>600秒（10分）</td><td>処理時間の上限値です。超えた場合はPythonアクションはエラーとなります。</td></tr><tr><td>インプットサイズの最大</td><td>66MiB</td><td>引数として渡すことのできるデータの最大サイズです。超えた場合はPythonアクションはエラーとなります。</td></tr><tr><td>アウトプットサイズの最大</td><td>66MiB</td><td>戻り値として出力できるデータの最大サイズです。超えた場合はPythonアクションはエラーとなります。</td></tr><tr><td>起動時間</td><td>10秒以上</td><td>Pythonアクションの起動には、最低でも必ず10秒以上の時間が発生します。</td></tr></tbody></table>

## 注意事項

{% hint style="warning" %}
以下の機能とPythonアクションを組み合わせて利用すると、

全ての繰り返しが完了するまでに時間を要する可能性があります。
{% endhint %}

* [繰り返しステップ](/solution-editor/logic/loop) の中で Pythonアクション を利用する

<figure><img src="/files/erH8YMNRuidRFucb7mOS" alt="" width="563"><figcaption></figcaption></figure>

{% hint style="danger" %}
以下の機能とPythonアクションを組み合わせて利用すると、

負荷が高まり処理が失敗する可能性があります。

Anyflow CS担当者にご相談ください。
{% endhint %}

* [ポーリングトリガー](/solution-editor/triggers/incoming/polling-triggers) と Pythonアクション を組み合わせて利用する

<figure><img src="/files/BRq5BqArcCvWDX3CTCi1" alt="" width="563"><figcaption></figcaption></figure>


# 変数アクション

変数のアクションの設定方法について

## **概要**

Anyflow Embedでは、変数アクションを使用して変数を自由に定義することが可能です。\
変数アクションを使用することにより、型を変換したデータを様々な箇所で使用可能です。\
複雑なソリューションの中で、同様の変数を参照したい場合に有効的に活用します。

{% hint style="success" %}

### 変数の適用範囲について

作成した変数アクションのソリューション内でのみ有効です。\
異なるソリューション間で横断的に同様の変数を適用することはできません。\
異なるソリューション間で横断的にデータを利用したい場合は、[キーバリューストア](/solution-editor/actions/data-store/kvs) を利用します。
{% endhint %}

***

## **変数を作成**

変数を選択し、「変数を作成」アクションを選択します。

変数定義を設定します。\
指定されたデータ型の変数を作成可能です。\
各変数は使用するデータ型に合わせて設定する必要があります。（例:文字列、リスト型）

|         |         |
| ------- | ------- |
| 入力フィールド | 説明      |
| 名前      | 変数の名前   |
| 型       | 変数のデータ型 |

<figure><img src="https://files.readme.io/4975926-1.gif" alt="1432"><figcaption><p>変数を定義します</p></figcaption></figure>

オブジェクトの設定をします。

定義したい変数を入力します。\
変数定義で指定したデータ型によって、設定するオブジェクトの内容が異なります。\
テキストやエンドユーザー変数、Formulaでの設定も可能です。

<figure><img src="https://files.readme.io/778e198-2.png" alt="573"><figcaption><p>定義したい変数をオブジェクトに入力します</p></figcaption></figure>

***

変数を選択し、「Formulaを使って変数を作成」アクションを選択します。

[変数を作成](/solution-editor/actions/data-transform/variable)アクションと同様に、変数定義を設定をします。

Formulaの詳細の設定方法については、[Formulaページ](/solution-editor/common-specs/formula) で説明しています。

***

## **変数を更新**

変数を更新アクションでは、ソリューション内の変数を更新することが可能です。

### **変数を更新アクションの例**

以下の例では、

* ステップ2で、number という変数を Integer 型で定義し、値を 0 に設定しています。
* ステップ3で、10個の要素をもったリストを作成します。
* ステップ4で、繰り返しを10回に設定しています。
* ステップ5で、ステップ2で作成した変数に「+1をする」ように更新しています。

<figure><img src="https://files.readme.io/af0dcb6-Screen_Shot_2023-03-16_at_9.55.30_PM.png" alt=""><figcaption></figcaption></figure>

結果的に、繰り返しが終わったステップ6では、「10」が出力されます。

<figure><img src="https://files.readme.io/5799f9e-Screen_Shot_2023-03-16_at_9.58.12_PM.png" alt=""><figcaption></figcaption></figure>

同様に、配列の要素が文字列の場合には以下の様に設定することで要素を追加できます。

<figure><img src="https://files.readme.io/f167b42-image.png" alt="" width="563"><figcaption></figcaption></figure>

まず、以下のような変数を定義します。

```json
[{
  "name": "foo",
  "id": "bar"
}]
```

<figure><img src="https://files.readme.io/2fe7bbf-Screen_Shot_2023-03-16_at_10.02.49_PM.png" alt="667"><figcaption><p>itemsというリスト変数を、変数を作成アクションで作成</p></figcaption></figure>

変数を更新アクションを使ってリストに要素を追加するには、以下のような設定を行います。\
更新する対象の変数を選択し、変数をFormulaモードに切り替え、以下のようなFormulaを設定します。

この例では、items変数自身に、以下の要素を追加しています。

```json
[{
  "name": "item-" + str(インデックス番号),
  "id": インデックス番号
}]
```

<figure><img src="https://files.readme.io/c19f4cf-Screen_Shot_2023-03-16_at_10.09.09_PM.png" alt="1668"><figcaption><p>formulaへの入力時は1行で記述します</p></figcaption></figure>

結果、このように出力されます。

<figure><img src="https://files.readme.io/bb801f2-Screen_Shot_2023-03-16_at_10.11.01_PM.png" alt=""><figcaption></figcaption></figure>


# リストアクション

## **概要**

リストは、`[1,2,3]`のようなリストを扱いやすくしたアクション郡を備えた標準コネクタです。

## **リストを作成** <a href="#create-list" id="create-list"></a>

空のリストを作成します。繰り返しアクションで、任意の数だけ繰り返す際に便利なアクションです。

### **入力フィールド**

| フィールド | 説明                                         |
| ----- | ------------------------------------------ |
| サイズ   | リストを作成するサイズです。5を入力した場合、5の長さをもったリストが作成されます。 |

### **アウトプット**

| フィールド | 説明                 |
| ----- | ------------------ |
| リスト   | 指定したサイズ分の長さをもったリスト |

## **リストの差分を抽出** <a href="#extract-list-diff" id="extract-list-diff"></a>

リスト同士の差分を抽出するアクションです。\
抽出対象のリストAと、比較対象のリストBを比較して、「抽出対象」にあって「比較対象」にないものを抽出します。

```
# 抽出対象
[{"a": 1}, {"b": 2}, {"c": 3}]

# 比較対象
[{"b": 2}]

# 結果
[{"a": 1}, {"c": 3}]
```

### **入力フィールド**

<table><thead><tr><th width="261.19921875">フィールド</th><th>説明</th></tr></thead><tbody><tr><td>抽出対象.リスト</td><td>抽出対象のオブジェクトのリストを指定します。</td></tr><tr><td>抽出対象.プロパティ変数定義</td><td>アウトプットに含めたいオブジェクトのプロパティを定義します。検索対象のオブジェクトに含まれていないプロパティを定義してもアウトプットは含まれません。</td></tr><tr><td>抽出対象.キー</td><td>「リスト」に指定したオブジェクトのうち、どのプロパティの値を比較対象にするのかを指定します。現時点では、オブジェクトや配列など、階層構造があるものには対応していません。</td></tr><tr><td>比較対象.リスト</td><td>比較対象のオブジェクトの配列を指定します。</td></tr><tr><td>比較対象.プロパティ変数定義</td><td>比較対象のオブジェクトのプロパティを定義します。このフィールドは「キー」を選択するためだけに使われるフィールドなので、アウトプットに影響はありません。</td></tr><tr><td>比較対象.キー</td><td>プロパティ変数定義で定義されたプロパティが選択できます。現時点では、オブジェクトや配列など、階層構造があるものには対応していません。</td></tr></tbody></table>

### **アウトプット**

| フィールド | 説明       |
| ----- | -------- |
| リスト   | 抽出されたリスト |

## **オブジェクトを検索** <a href="#search-object-list" id="search-object-list"></a>

リストに含まれているオブジェクトのキーを指定して検索するアクションです。

```
# リスト
[{"rank": "normal", "name": "田中太郎"}, {"rank": "gold", "name": "山田花子"}, {"rank": "gold", "name": "伊藤愛"}]

# 検索条件
[{"rank": "gold"}]

# 結果
[{"rank": "gold", "name": "山田花子"}, {"rank": "gold", "name": "伊藤愛"}]
```

### **入力フィールド**

| フィールド          | 説明                                                                         |
| -------------- | -------------------------------------------------------------------------- |
| 検索するオブジェクトのリスト | 検索対象のオブジェクトのリストを指定します。                                                     |
| プロパティ変数定義      | アウトプットに含めたいオブジェクトのプロパティを定義します。検索対象のオブジェクトに含まれていないプロパティを定義してもアウトプットは含まれません。 |
| 検索条件           | 検索したいキーと値を指定します。検索条件はAND条件です。                                              |
| 検索条件.キー        | プロパティ変数定義で定義されたプロパティが選択できます。現時点では、オブジェクトや配列など、階層構造があるものには対応していません。         |
| 検索条件.値         | 検索条件のキーで選択したキーの値を入力します。値は完全一致で比較されます。                                      |

### **アウトプット**

| フィールド | 説明       |
| ----- | -------- |
| リスト   | 検索されたリスト |


# 日付と時刻アクション

日付と時刻はAnyflowの標準アプリで、以下の処理を実行できます。

* 日付や時刻のフォーマットを変換する
* 指定した時間だけスリープする

## **日時形式を変換** <a href="#convert-datetime" id="convert-datetime"></a>

日付形式を変換することができるアクションです。

### 入力フィールド

<table><thead><tr><th width="166.92578125">フィールド名</th><th>説明</th></tr></thead><tbody><tr><td>日時</td><td>変換したい日時を入力します。</td></tr><tr><td>フォーマット</td><td>変換したい形式を選択します。<br>また、選択肢にないフォーマットに変換したい場合は直接入力できます。</td></tr></tbody></table>

{% hint style="success" %}

### ヒント

以下のフォーマットは一部を抜粋しています。[詳細はこちらのドキュメント](https://pendulum.eustace.io/docs/#tokens)を参照してください。
{% endhint %}

### フォーマット <a href="#format" id="format"></a>

<table><thead><tr><th width="119.80859375">対象</th><th width="119.703125">フォーマット</th><th>出力例</th></tr></thead><tbody><tr><td>年</td><td>YYYY</td><td>2000, 2001, 2002 ... 2012, 2013</td></tr><tr><td></td><td>YY</td><td>00, 01, 02 ... 12, 13</td></tr><tr><td></td><td>Y</td><td>2000, 2001, 2002 ... 2012, 2013</td></tr><tr><td>月</td><td>MMM</td><td>January, February, March ...</td></tr><tr><td></td><td>MM</td><td>01, 02, 03 ... 11, 12</td></tr><tr><td></td><td>M</td><td>1, 2, 3 ... 11, 12</td></tr><tr><td>通日</td><td>DDDD</td><td>001, 002, 003 ... 364, 365</td></tr><tr><td></td><td>DDD</td><td>1, 2, 3 ... 4, 5</td></tr><tr><td>日付</td><td>DD</td><td>01, 02, 03 ... 30, 31</td></tr><tr><td></td><td>D</td><td>1, 2, 3 ... 30, 31</td></tr><tr><td>曜日</td><td>dddd</td><td>Monday, Tuesday, Wednesday ...</td></tr><tr><td></td><td>ddd</td><td>Mon, Tue, Wed ...</td></tr><tr><td></td><td>dd</td><td>Mo, Tu, We ...</td></tr><tr><td></td><td>d</td><td>0, 1, 2 ... 6</td></tr><tr><td>時間</td><td>HH</td><td>00, 01, 02 ... 23, 24</td></tr><tr><td></td><td>H</td><td>0, 1, 2 ... 23, 24</td></tr><tr><td></td><td>hh</td><td>01, 02, 03 ... 11, 12</td></tr><tr><td></td><td>h</td><td>1, 2, 3 ... 11, 12</td></tr><tr><td>分</td><td>mm</td><td>00, 01, 02 ... 58, 59</td></tr><tr><td></td><td>m</td><td>0, 1, 2 ... 58, 59</td></tr><tr><td>秒</td><td>ss</td><td>00, 01, 02 ... 58, 59</td></tr><tr><td></td><td>s</td><td>0, 1, 2 ... 58, 59</td></tr><tr><td>少数秒</td><td>S</td><td>0 1 ... 8 9</td></tr><tr><td></td><td>SS</td><td>00, 01, 02 ... 98, 99</td></tr><tr><td>タイムゾーン</td><td>Z</td><td>-07:00, -06:00 ... +06:00, +07:00</td></tr><tr><td></td><td>ZZ</td><td>-0700, -0600 ... +0600, +0700</td></tr></tbody></table>

**例**

<figure><img src="https://files.readme.io/7978fc1-Screen_Shot_2023-05-23_at_4.53.06_PM.png" alt="&#x60;YYYY年MM月D日 HH時mm分ss秒&#x60; というフォーマットを入力" width="400"><figcaption><p><code>YYYY年MM月D日 HH時mm分ss秒</code> というフォーマットを入力</p></figcaption></figure>

<figure><img src="https://files.readme.io/3392ac6-Screen_Shot_2023-05-23_at_4.54.20_PM.png" alt="ワークフロー実行時間を任意のフォーマットに変換(UTC時間)" width="563"><figcaption><p>実行開始日時を任意のフォーマットに変換(UTC時間)</p></figcaption></figure>

{% hint style="success" %}

### Tips

タイムゾーンを変換するには、Formulaモードに切り替え、`in_timezone` 関数を利用します。

![](https://files.readme.io/897e8d2-Screen_Shot_2023-05-23_at_4.57.52_PM.png)
{% endhint %}

## **指定した時間処理をスリープ** <a href="#sleep" id="sleep"></a>

指定した時間だけ、ソリューションの処理を一時停止（スリープ）させるアクションです。

### **入力フィールド**

| フィールド名   | 説明                                                                                           |
| -------- | -------------------------------------------------------------------------------------------- |
| スリープする時間 | <p>処理を一時停止させる時間を設定します。<br>「選択」を選ぶと1分〜60分の選択肢の中から選択できます。<br>「直接入力」を選ぶと停止させる秒数を小数値で指定できます。</p> |

<figure><img src="https://files.readme.io/4c39a19-image.png" alt="「選択」を選んだ場合" width="563"><figcaption><p>「選択」を選んだ場合</p></figcaption></figure>

<figure><img src="https://files.readme.io/4455c28a32e2b22975c67faec4bbcee6ce8bd5b4c3180174faa404f13a7999bb-image.png" alt="「直接入力」を選んだ場合" width="563"><figcaption><p>「直接入力」を選んだ場合</p></figcaption></figure>


# CSVアクション

CSVアクションはAnyflowの標準アプリで、以下の処理を実行できます。

* CSVを作成
* CSVを解析

## **CSVを作成**

配列からCSV形式の文字列を作成します。

### **入力フィールド**

<table><thead><tr><th width="214.18359375">フィールド名</th><th>説明</th></tr></thead><tbody><tr><td>CSV列名（改行区切り）</td><td>CSVの列名を <strong>1行ごと</strong> に入力します。<br>例:<br>列名1<br>列名2<br>列名3</td></tr><tr><td>ヘッダー行を作成する</td><td>「はい」を選択すると、指定した列名を使用してヘッダー行が作成されます。</td></tr><tr><td>カラム区切り文字</td><td>CSVコンテンツの区切り文字を指定します。区切り文字は以下から指定できます。<br>カンマ（,）スペース（ ）タブ（\t）コロン（:）セミコロン（;）パイプ（|）</td></tr><tr><td>引用符（"）を付加する</td><td>「はい」を選択すると、すべての値を引用符で囲います。</td></tr></tbody></table>

### **入力例**

freee人事労務から取得したデータを使いCSVを作成する例です。

<figure><img src="https://files.readme.io/7126751f502d120eab915941ec6d245b75f990cc851244097ae7645e6e1508c1-image.png" alt=""><figcaption></figcaption></figure>

<figure><img src="https://files.readme.io/9eb18af6281c26fc1fa19d069f5c99e5aba13cdeeb33b76f56e057810ef143b2-image.png" alt=""><figcaption></figcaption></figure>

## **CSVを解析**

CSV形式の配列を行の配列に変換します。

### **入力フィールド**

<table><thead><tr><th width="233.234375">フィールド名</th><th>説明</th></tr></thead><tbody><tr><td>エンコード自動検出</td><td><p>文字列のエンコーディング方法を選択します。</p><p>有効: ファイルの文字列エンコードを自動で識別したうえで、適切にデコードし CSV を解析します。テキストデータが格納されたファイルは識別可能です。識別できない場合はエラーになります。<br>無効: ファイルがデコードされていることを前提に CSV を解析します。</p></td></tr><tr><td>CSVコンテンツ</td><td>最大ファイルサイズは50MBです。最大セル数は2,000,000セルです。</td></tr><tr><td>カラム区切り文字</td><td>CSVコンテンツの区切り文字を指定します。区切り文字は以下から指定できます。<br>カンマ（,）スペース（ ）タブ（\t）コロン（:）セミコロン（;）パイプ（|）</td></tr><tr><td>CSVコンテンツにヘッダー行が含まれている</td><td>CSVコンテンツに解析してはいけないヘッダー行がある場合は「はい」を選択します。</td></tr><tr><td>ヘッダー行</td><td>ヘッダー行を入力します。 カラム名は上記の「カラム区切り文字」フィールドで指定した文字で区切る必要があります。<br>例:カンマを指定した場合<br>ヘッダー1, ヘッダー2, ヘッダー3</td></tr></tbody></table>

### **入力例**

Google Drive から取得したデータを使いCSVを作成する例です。

<figure><img src="https://files.readme.io/2702c20baeb00fc886db7b6399d1797db8a0e1b857025f66bf115ec3f5121851-image.png" alt=""><figcaption></figcaption></figure>


# データの記録


# キーバリューストア（KVS）アクション

## **概要**

キーバリューストア（KVS）は、キーとバリューを組み合わせた簡易的なデータストアです。キーバリューストアを使うことで、ワークフローの実行が終了した後でもデータを保持することが可能です。

## **スコープ**

<figure><img src="https://files.readme.io/95e8be5-image.png" alt=""><figcaption></figcaption></figure>

### **このワークフロー**

* このワークフロー（ソリューション）の中でのみデータが共有されます。
* ソリューションをアンインストールした時点でデータは再利用できなくなります。\
  （再度インストールしたとしても、以前インストールした際のデータは参照できません）
* 例1：ソリューション内で処理したデータ件数をカウントアップし、累積データ件数を記録
* 例2：自社プロダクトのIDを「キー」に、SalesforceのIDを「値」に設定し、データのマッピングデータを記録

### **すべてのワークフロー**

* このワークフローだけでなく、KVSを適用している他のワークフロー（ソリューション）にもデータが共有されます。
* ソリューションをアンインストールしてもデータは再利用できます。\
  （再度インストールした場合でも、以前インストールした際のKVSのデータは参照可能です）
* 例：
  * Salesforce連携のソリューションAにて、\
    自社プロダクトのIDを「キー」に、SalesforceのIDを「値」に設定し、データのマッピングデータを記録
  * その後、HubSpot連携のソリューションBにて、\
    Salesforce連携のマッピングデータを参照して処理を行う

{% hint style="success" %}

### ヒント

いずれの場合でも、エンドユーザー（またはエンドユーザーチーム）を超えてKVSの情報が共有されることはありません。
{% endhint %}

{% hint style="danger" %}

### テスト時の注意

テストモードではソリューションがもつすべてのデータは毎回リセットされるため、KVSの厳密な挙動を確認することはできません。
{% endhint %}

## **データを保存**

指定したキーにデータを保存します。

<figure><img src="https://files.readme.io/b224c15-Screen_Shot_2023-03-20_at_6.57.46_PM.png" alt="838" width="563"><figcaption><p><code>sample</code> というキーに対して <code>hello world</code> という文字列を保存</p></figcaption></figure>

{% hint style="success" %}

### ヒント

保存可能サイズの上限は各キーごとの制限です。KVS全体に対する制限ではありません。
{% endhint %}

## **データを取得**

指定したキーのデータを取得します。

<figure><img src="https://files.readme.io/5501f8f-Screen_Shot_2023-03-20_at_6.58.37_PM.png" alt="835" width="563"><figcaption><p><code>データを保存</code> した後のステップで <code>sample</code> キーに入っているデータを取得</p></figcaption></figure>

<figure><img src="https://files.readme.io/c116ca4-Screen_Shot_2023-03-20_at_6.58.50_PM.png" alt="390"><figcaption><p><code>データを保存</code> で <code>sample</code> に <code>hello world</code> を保存していたので、取得が成功</p></figcaption></figure>

## **キーを削除**

指定したキーのデータを削除します。

<figure><img src="https://files.readme.io/5b47b2b-Screen_Shot_2023-03-20_at_7.00.34_PM.png" alt="358" width="563"><figcaption><p><code>sample</code> を削除した後、<code>データを取得</code> してみた例。valueがnullになり、削除されていることが確認できる</p></figcaption></figure>

## **リストデータを保存**

指定したキーにリストデータを保存します。

<figure><img src="https://files.readme.io/645a193-Screen_Shot_2023-03-20_at_7.04.23_PM.png" alt="831" width="563"><figcaption><p><code>sample_list</code> キーに <code>["hello", "world"]</code> というデータを保存</p></figcaption></figure>

## **リストデータの存在を確認**

指定したキーのリストデータの中に、指定したデータが含まれているかを確認します。

<figure><img src="https://files.readme.io/f239806-Screen_Shot_2023-03-20_at_7.05.31_PM.png" alt="835" width="563"><figcaption><p><code>sample_list</code> キーに保存されているリストデータに、<code>hello</code> が含まれているかどうかを確認</p></figcaption></figure>

<figure><img src="https://files.readme.io/6be43a6-Screen_Shot_2023-03-20_at_7.06.38_PM.png" alt="364"><figcaption><p>値が含まれているので<code>true</code></p></figcaption></figure>

{% hint style="success" %}

### リストデータを取得するには？

2023年3月時点ではリストデータを取得するアクションは提供していません。変数更新アクションで代替できる場合がありますので、[参考](/solution-editor/actions/data-transform/variable#wo-1)にしてください。
{% endhint %}

## **JSON形式で保存するには**

データの入力モードを[formula](/solution-editor/common-specs/formula)に変更し、`json_dumps`関数を使うとJSON文字列として保存できます。

<figure><img src="https://files.readme.io/47f4584-image.png" alt=""><figcaption></figcaption></figure>


# ログアクション

## 概要

ログアクションは、以下の2つのユースケースで活用できるアクションです。

* 任意の文字列、変数などをデバッグするために利用する
* エンドユーザー向けのログメッセージを、ソリューションの実行履歴に表示する

## デバッグに利用する

<figure><img src="https://files.readme.io/f9473fa-Screen_Shot_2023-03-20_at_5.57.03_PM.png" alt=""><figcaption></figcaption></figure>

下記のようなソリューションを構築した場合に、テスト実行画面では以下のような出力が確認できます。

<figure><img src="https://files.readme.io/70c6d99-Screen_Shot_2023-03-20_at_5.56.35_PM.png" alt=""><figcaption></figcaption></figure>

変数の中身を詳細に確認したい場合やFormulaの結果を出力する際に活用できます。

{% hint style="success" %}

### ヒント

ログでの出力は、変数の型に関係なくString型に変換されて出力されます。

ただしFile型などの一部の変数では変換ができない場合があり、その場合は[Formula](/solution-editor/common-specs/formula)の`str()関数`を利用することでログ出力を行ってください。
{% endhint %}

<figure><img src="https://files.readme.io/1931b7f-image.png" alt="Google Drive から取得したFile型の変数をstr()して出力する" width="600"><figcaption><p>Google Drive から取得したFile型の変数をstr()して出力する</p></figcaption></figure>

<br>

## エンドユーザーにログメッセージを表示する

ログアクションで出力されたログは、ウィザード内の「ソリューション実行履歴」にも表示され、エンドユーザーも確認できます。ソリューションの実行履歴の詳細については、[こちら](https://anyflow.readme.io/docs/%E3%82%A8%E3%83%B3%E3%83%89%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%81%B4%E3%81%A7-%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%E9%80%A3%E6%90%BA%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E5%86%8D%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B)を参照してください。

以下のソリューションでは3つのログを出力しており、それが実行履歴に表示されていることがわかります。

<figure><img src="https://files.readme.io/5b7910c-image.png" alt="ソリューションの設定内容"><figcaption><p>ソリューションの設定内容</p></figcaption></figure>

<figure><img src="https://files.readme.io/9a5bdc7-image.png" alt="実行履歴からエンドユーザーも確認できる"><figcaption><p>実行履歴からエンドユーザーも確認できる</p></figcaption></figure>


# メールアクション

## 概要

メールアプリは、Anyflowからメールを送ることができるアプリです。

<figure><img src="https://files.readme.io/22e3e43-send_mail.png" alt="" width="563"><figcaption></figcaption></figure>

### メールの送信先のアドレスについて

カンマ区切りで入力することで、複数アドレスに送付することが可能です。

<pre><code><strong>（例）example-1@anyflow.co.jp,example-2@anyflow.co.jp
</strong></code></pre>

{% hint style="success" %}

### エンドユーザーが指定したアドレスを送信先に設定したい時

エンドユーザー変数を作成し、Toに設定することで、エンドユーザーが指定したアドレスを送信先に設定することができます。

複数アドレスを設定いただく場合は、カンマ区切りで入力するように注釈を入れることがおすすめです。

▪️エンドユーザー変数を設定する

<img src="/files/6Ed1ODnn6iCbvz5vlNB3" alt="" data-size="original">

▪️ウィザードに送付先アドレスの入力欄を設ける

<img src="/files/g4oLlfu5uYti0wmKg9GN" alt="" data-size="original">
{% endhint %}

### メールの送信元のアドレスについて

* `noreply@anyflow.jp` からメールが送信されます。
* 送信元のアドレスを変更することはできません。

### エラーケースについて

* メールアドレス形式でないものがTo, CC, BCCに含まれていた場合、アクションはエラーになります。
* メールの到達、未到達に関わらずエラーにはなりません。
* ToとBccが同一のメールアドレスだった場合、アクションはエラーになります。


# ロジック


# if

ステップの種類のうち、ifについて

ifステップは、指定された条件が満たされた場合に、ステップを実行するためのものです。\
例えば、以下のスクリーンショットは、GoogleDriveのファイル名に `Test` を含んでいる場合Slackにメッセージを投稿するためにifステップを使用しています。

<figure><img src="https://files.readme.io/2fa38db-if_step.png" alt=""><figcaption></figcaption></figure>

また、ifステップの「︙」をクリックすることで、elseステップを作成することができます。\
elseステップは、ifステップの条件が合致しなかった場合に実行されるステップです。

<figure><img src="https://files.readme.io/1778f92-else.png" alt=""><figcaption></figcaption></figure>

## **ifステップの状態について**

ifステップの「状態」とは、値を比較するときの条件のことを指します。

<figure><img src="https://files.readme.io/c75343f-Screen_Shot_2023-01-31_at_4.14.59_PM.png" alt="" width="563"><figcaption></figcaption></figure>

<table><thead><tr><th width="118.63671875">状態名</th><th width="348.20703125">説明</th><th>受け付ける型</th></tr></thead><tbody><tr><td>等しい</td><td>データが、等しい場合、真になる</td><td>すべての型</td></tr><tr><td>等しくない</td><td>データが、等しくない場合、真になる</td><td>すべての型</td></tr><tr><td>空である</td><td>データが、空である場合、真になる</td><td>すべての型</td></tr><tr><td>空でない</td><td>データが、空でない場合、真になる</td><td>すべての型</td></tr><tr><td>含まれている</td><td>データが、値に含まれている場合、真になる</td><td>Array型、Object型、String型</td></tr><tr><td>含まれていない</td><td>データが、値に含まれていなければ、真になる</td><td>Array型、Object型、String型</td></tr><tr><td>以上</td><td>データが、値以上であれば、真になる</td><td>String型、Boolean型、Integer型、Decimal型、Date型、DateTime型</td></tr><tr><td>より大きい</td><td>データが、値より大きければ、真になる</td><td>String型、Boolean型、Integer型、Decimal型、Date型、DateTime型</td></tr><tr><td>以下</td><td>データが、値以下であれば、真になる</td><td>String型、Boolean型、Integer型、Decimal型、Date型、DateTime型</td></tr><tr><td>より小さい</td><td>データが、値より小さければ、真になる</td><td>String型、Boolean型、Integer型、Decimal型、Date型、DateTime型</td></tr><tr><td>真である</td><td>データが、真である場合、真になる</td><td>Boolean型、false, true という文字</td></tr><tr><td>真でない</td><td>データが、真ではない場合、真になる</td><td>Boolean型、false, true という文字</td></tr></tbody></table>


# 繰り返し

繰り返しステップは、入力フィールドでリスト（例: 複数のkintoneレコード）を受け取り、リストの個数分だけステップを繰り返すものです。

ソリューションによって、リスト内のすべての項目に対して一連のアクションを実行する必要がある場合があります。\
このような場合に役立つのが、繰り返しステップです。

繰り返し内でインデントされたアクションは、リスト内の全項目に対して実行されます。

例えば以下のスクリーンショットのステップでは、step番号2のkintoneの`レコードを検索` アクションでヒットするレコードの一覧をリストで取得した後、step番号3で繰り返しステップを使いレコードの数だけstep番号4を繰り返しています。

<figure><img src="https://files.readme.io/bfb2362-for_each.png" alt=""><figcaption></figcaption></figure>

また、繰り返しステップの入力フィールドの`繰り返すリスト` の型はリストである必要があります。

変数ウィンドウでは、下図のようにリスト型のみが使用可能であることを認識することができます。（選択不可能な変数は選択できません。）

<figure><img src="https://files.readme.io/3967201-variable_window.png" alt=""><figcaption></figcaption></figure>

### **繰り返しモード**

Anyflowの繰り返しステップには、2つのモードが存在します。

1. アイテムごとに繰り返す
2. アイテムをまとめて繰り返す

<figure><img src="https://files.readme.io/a610008-repeat_mode.png" alt=""><figcaption></figcaption></figure>

通常は、1 の `アイテムごとに繰り返す` を使用してください。

ただ、時には上流のアプリやシステムがデータを送信する速度が、下流のアプリやシステムがデータを受信できる速度よりも速い場合があります。\
アイテムをまとめる個数を設定することで、このようなデータを処理するために`アイテムをまとめて繰り返す`機能を使用して解決することができます。

`アイテムをまとめて繰り返す` 機能を使うことで、\[1, 2, 3, 4, 5]のようなリストを、まとめる個数を2に設定した場合、`[1, 2]、[3, 4]、[5]` のようにまとめられて繰り返されるようになります。

5回の繰り返しが3回の繰り返しになるので、アクションの回数を減らすことが可能になります。

## **Breakステップ**

Breakステップは、繰り返しステップの中でのみ利用できるステップです。\
ifステップと併用することで、繰り返しステップを任意のタイミングで停止することが可能です。

**使い方**

繰り返しステップ内でステップの追加メニューを開くとBreakステップを選択することができます。

<figure><img src="https://files.readme.io/a55d641c6af672e156694c5f10163250354431d24b47631fcd716935b70151c3-_2025-02-14_17.26.33.png" alt=""><figcaption></figcaption></figure>

ifステップで繰り返しを停止する条件分岐を作成し配置することで、目的が達成された際に繰り返しステップの処理を終了することが可能です。

**例**

リストを取得し、要素ごとに繰り返しステップを行います。\
要素の値がエンドユーザー変数「入力値」と等しい場合はBreakステップにより繰り返し処理を終了し、等しくない場合は変数を更新し、リストの次の要素で処理を繰り返します。

<figure><img src="https://files.readme.io/7cef85d24f0f9248d83c351f60dc8685277d4b2bd8210fec2f999404dbeb477f-_2025-02-17_14.27.32.png" alt=""><figcaption></figcaption></figure>


# エラー監視

エラー監視は、「エラー監視」ステップの内側に追加したステップでエラーが発生した場合、「エラーならば」ステップの内側に処理が遷移します。

エラー監視ステップを追加するには、ソリューションエディタで「+」ボタンをクリック、次に「エラー」をクリックして追加します。

&#x20;

<figure><img src="https://files.readme.io/8241bae-try-catch.png" alt=""><figcaption></figcaption></figure>

<figure><img src="https://files.readme.io/1cadf53-try-catch.png" alt="" width="563"><figcaption></figcaption></figure>

上記の図で説明すると、「エラー監視」ステップの内側の「レコードを作成」ステップでエラーが発生した場合、「エラーならば」の内側に配置してある「メールを送信」ステップが実行されます。

メインユースケースとしては、該当ステップがエラーになった際にエンドユーザーに対してメールを送信する、ベンダーに対してメールを送信する、ログを出力するなどが考えられます。

{% hint style="success" %}

### ヒント

「エラーならば」のステップに遷移するかの判定は、アクションの[自動的な再試行（リトライ）](/ops/solution-error/action-retry)がすべて失敗した後で行われます。
{% endhint %}

## **SaaS Error と Anyflow Error**

### **SaaS Error**

SaaSのAPI呼び出しを行った結果、正常でないレスポンスが返却された場合にはエラーメッセージ冒頭に「SaaS Error:」の文字列が表示されます。

このエラーは[API呼び出しを行うアクション](/solution-editor/actions/api-call)でのみ発生します。

以下の例は、Google Sheetsのアクションにて存在しないスプレッドシートIDが指定されたことによる、404エラーの表示です。

<figure><img src="/files/crrCNc8K4SEYddGfU4c0" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="/files/2x3yQFMicyY4FKGXazn7" alt="" width="563"><figcaption></figcaption></figure>

### **Anyflow Error**

SaaSのAPI呼び出しを行う以前に、入力フィールドの処理にエラーがある等の場合にはエラーメッセージ冒頭に「Anyflow Error:」の文字列が表示されます。

このエラーはすべてのアクションで発生する可能性があります。

以下の例は、Google SheetsのアクションにてスプレッドシートIDに不正なformulaが渡されたことによるエラー表示です。

<figure><img src="/files/mXONy71jAXCpSsSjSasq" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="/files/PmqxdUu9n97fBBa63RoI" alt="" width="563"><figcaption></figcaption></figure>

## **「エラーならば」で使用できる変数について**

エラーの詳細は、「エラーならば」の内側で変数として利用できます。

<figure><img src="https://files.readme.io/6c217a8-image.png" alt="ソリューションエディタの変数ウィンドウ"><figcaption><p>ソリューションエディタの変数ウィンドウ</p></figcaption></figure>

各変数の内容は以下のとおりです。

<table><thead><tr><th width="135.36328125">変数名</th><th>説明</th></tr></thead><tbody><tr><td>Error Type</td><td><p>エラーの種類を表す文字列です。基本的には<code>http</code> または <code>error</code> が入りますが、コネクタのアクションごとに個別に定義された文字列が入ることもあります。</p><p><code>http</code>：HTTP 通信が直接の原因で発生したエラーです。<br><code>error</code>：エラーの原因が特定できないか、 Error Type が定義されていないエラーです。<br>上記以外：コネクタのアクションごとに個別に定義されたエラーです。</p></td></tr><tr><td>Error Message</td><td>エラーの内容を表すメッセージです。</td></tr><tr><td>Status Code</td><td>error_type が <code>http</code> であるときのみ、エラーの原因となった HTTP レスポンスのステータスコードが入ります。それ以外の場合は <code>None</code> が入ります。</td></tr></tbody></table>

{% hint style="warning" %}
formulaのエラーや型のエラーなどは「エラーならば」の変数としては出力できません。
{% endhint %}

## **実行履歴に遷移するURL**

上記の例では、実行履歴の詳細を確認するためのURLを記載しています。

<figure><img src="https://files.readme.io/77708ceaf20e41e19e282ecf124f59eccbe9c29ce6f2c2e127a3b2bcd1beea16-image.png" alt="エラー時の通知設定" width="600"><figcaption><p>エラー時の通知設定</p></figcaption></figure>

<figure><img src="https://files.readme.io/caaafb4c4f52f1b635c5d677f67e9ae44ae49b478e8a1d149969e9068ec93bb2-image.png" alt="遷移先の詳細画面"><figcaption><p>遷移先の詳細画面</p></figcaption></figure>

実行履歴の詳細ページのURLは以下の形式です。

`https://embed.anyflow.jp/jobs/{実行履歴ID}`

「実行履歴ID」は**標準変数**に定義されており、エラー時以外でも利用することができます。

<figure><img src="https://files.readme.io/283726ffcd9979e0ea3e2b20a6f25d285687bc495a13be24d3438af0ad509947-image.png" alt="" width="563"><figcaption></figcaption></figure>


# 停止

ステップの種類のうち、停止について

停止ステップとは、ソリューション内の任意のステップで、処理の実行を停止することができるステップです。

<figure><img src="https://files.readme.io/13094da-image.png" alt=""><figcaption></figcaption></figure>

## **設定**

実行ステータス&#x3067;**「成功にする」**&#x3092;選択すると、その実行履歴の状態は成功となります。

<figure><img src="https://files.readme.io/4e82bc0-image.png" alt="「成功にする」を設定"><figcaption><p>「成功にする」を設定</p></figcaption></figure>

<figure><img src="https://files.readme.io/da0dab6-image.png" alt="実行ステータスが「成功」で停止"><figcaption><p>実行ステータスが「成功」で停止</p></figcaption></figure>

実行ステータス&#x3067;**「失敗にする」**&#x3092;選択すると、その実行履歴の状態は失敗となります。

**「メッセージ」**&#x306B;は、停止ステップにより実行失敗となった際に出力するメッセージを指定できます。

<figure><img src="https://files.readme.io/ad6d8dd-image.png" alt="「失敗にする」と、メッセージを設定"><figcaption><p>実行ステータスを「失敗」にしてメッセージを設定</p></figcaption></figure>

<figure><img src="https://files.readme.io/e094e6a-image.png" alt="実行ステータスが「失敗」で停止 &#x26; メッセージが表示"><figcaption><p>実行ステータスが「失敗」で停止 &#x26; メッセージが表示</p></figcaption></figure>

## **注意すべきケース**

メッセージの記述や処理に誤りがある場合、他のステップと同様に、**停止ステップ自体がエラー**となります。

以下のような設定を行った場合、実行処理は停止ステップの箇所で停止しますが、停止ステップの処理として停止するわけではなく、**設定不備によるエラー**として停止します。

<figure><img src="https://files.readme.io/559c3f3-image.png" alt="設定不備の例：sum関数が正しく入力されていない"><figcaption><p>設定不備の例：sum関数が正しく入力されていない</p></figcaption></figure>

<figure><img src="https://files.readme.io/bf8593e-image.png" alt="エラーによる意図しない停止"><figcaption><p>エラーによる意図しない停止</p></figcaption></figure>

従って上記のような設定不備がある場合に\
[エラー監視ステップ](/solution-editor/logic/error-monitoring)の内側で停止ステップを利用すると、停止ステップの箇所で停止されないことになります。

<figure><img src="https://files.readme.io/5788c8b-image.png" alt="エラー監視ステップの内側に、設定不備のある停止ステップを配置"><figcaption><p>エラー監視ステップの内側に、設定不備のある停止ステップを配置</p></figcaption></figure>

<figure><img src="https://files.readme.io/cd2f333-image.png" alt="停止ステップの箇所（4番目）で停止せず、「エラーならば」以降（6番目）へ進行"><figcaption><p>停止ステップの箇所（4番目）で停止せず、「エラーならば」以降（6番目）へ進行</p></figcaption></figure>

これは、設定不備によるエラーをエラー監視ステップが捕捉し、**「エラーならば」の内側のステップが実行される**ためです。

エラー監視ステップと併用する場合は、設定に不備がないかを十分にご確認ください。


# ページネーション

ページネーションとは、大量のデータを複数のページに分割して取得ができる仕組みです。

SaaSごとにページングのサイズが異なったり、ページネーションの設定方法が異なります。\
そのため、各SaaSのAPIドキュメントを確認しながらページネーションを構築してください。

今回は**SlackBotでユーザー一覧を取得する際にページネーションで取得する方法**をご紹介します。200件ずつAPIでユーザーを取得し、1つのデータに格納していく使い方をご紹介します。

{% hint style="info" %}

#### SlackのAPIドキュメント

詳細は下記を参照してください。\
<https://docs.slack.dev/reference/methods/users.list/>
{% endhint %}

今回作成するページネーションの流れは下記の通りです。

<figure><img src="/files/dMb8sHg2jNS1NpC0soVR" alt=""><figcaption><p>✳️Anyflow Embedではfor文しか扱えない為、ループ回数の定義が必要です。</p></figcaption></figure>

ソリューションの詳細な作り方は下記をご確認ください。

{% hint style="success" %}

### 使用するアクションやロジックについて

詳細については下記を参照してください。

[変数について](https://docs-embed.anyflow.jp/solution-editor/actions/data-transform/variable)

[リストについて](https://docs-embed.anyflow.jp/solution-editor/actions/data-transform/list)

[繰り返しについて](https://docs-embed.anyflow.jp/solution-editor/logic/loop)
{% endhint %}

### 変数を作成する

変数アクションを追加します。

* \[Formulaで変数を作成]を選択します。
  * 変数定義：手動追加します。追加する定義は下記の通りです。
    * 名前\[next cursor]、型\[String]で、追加します。
  * 変数のオブジェクト：入力をFormulaに変更し、\[None]と入力します。

<figure><img src="/files/WBimS4nJ3n5u64Vv5vz5" alt="" width="375"><figcaption></figcaption></figure>

もう1つ変数アクションを追加します。

* \[Formulaで変数を作成]を選択します。
  * 変数定義：JSONまたは手動で追加できます。

{% tabs %}
{% tab title="{}JSONで追加" %}
JSONを入力するモーダルが表示されるので、以下のJSONをコピーして貼り付けます。

```
{  
  "user_list": [  
    {  
      "user": {}  
    }  
  ]  
}
```

{% endtab %}

{% tab title="手動追加" %}
手動追加追加する定義は下記の通りです。

* 名前\[user\_list]、型\[Array]で、任意項目にするにチェックを入れて追加します。

* 名前\[user]、型\[Object]で、任意項目にするにチェックを入れて追加します。

* userをuser\_listの配下に設定します。
  {% endtab %}
  {% endtabs %}

* 変数のオブジェクト：入力をFormulaに変更し、\[]と入力します。

<figure><img src="/files/BsBCqPKEnIhq95pdajSn" alt="" width="563"><figcaption></figcaption></figure>

変数を作成できたら、\[ユーザー一覧を取得]のステップを修正します。

* 取得件数：200と入力します。
* カーソル：変数の\[next cursor]に変更します。

<figure><img src="/files/sUk9jiLUficd2ijgaiWW" alt="" width="563"><figcaption></figcaption></figure>

### リストを作成する

次にリストを作成します。

* リストのアクションを追加します。
  * リストを作成を選択します。
    * サイズ：任意のサイズを設定します。今回は\[1000]とします。

<figure><img src="/files/pCUbJzLaVtnW2V6z6D4C" alt="" width="563"><figcaption></figcaption></figure>

### 繰り返しを設定する

次に繰り返しを設定します。繰り返しアクションを設定しないとリストを受け取ることができません。

* \[+]ボタンをクリックし、\[繰り返し]ステップを選択します。
  * 繰り返すリスト：変数の\[リスト]を選択します。
  * 繰り返しモード：\[アイテムごとに繰り返す]を選択します。

<figure><img src="/files/Zspc7EY5jwK9nm8RiiN6" alt="" width="563"><figcaption></figcaption></figure>

### 繰り返しにユーザー一覧取得を配置する

繰り返しステップの中にユーザー一覧を取得のステップを移動させます。

次に繰り返しユーザー一覧を取得するために変数の更新を2つ設定します。

1つ目の変数の更新

* ステップを追加しアクションから変数を選択します。
  * 変数を更新を選択します。
    * 変数選択：\[next cursor]を選択します。
    * オブジェクト：変数の\[NextCursor]を選択します。

<figure><img src="/files/L3LAvyR8vPBWXwiyzkaB" alt="" width="563"><figcaption></figcaption></figure>

2つ目の変数の更新

* ステップを追加しアクションから変数を選択します。
  * 変数を更新を選択します。
    * 変数選択：変数の\[user\_list]を選択します。
    * オブジェクト：変数を使用します。入力をFormulaに変更し、下記のように入力します。

```
[list(user_list | Step4)] + [(Members | Step7)]
```

<figure><img src="/files/3nZj1VeaP7IKynkYeR8q" alt="" width="563"><figcaption></figcaption></figure>

### 取得するページがなくなったら終了するステップを追加する

リストで設定したページよりも件数が少なかった場合に、取得を終了するステップを追加します。

* ステップで\[if]を選択します。
  * データ：変数にある\[NextCursor]を選択し、状態は\[空である]を選択します。
* 次のYes側にBreakのステップを追加します。

<figure><img src="/files/og3FfWj9C0VIfiUNR5Jr" alt="" width="563"><figcaption></figcaption></figure>

### レスポンスの設定を修正する

リストでユーザー一覧を取得した場合、レスポンスペイロードが変わるため、設定を修正します。

* レスポンス名を\[user\_list]に変更します。
  * リストソース：変数の\[user\_list]を選択します。
  * id：変数を使用します。入力をFormulaに変更し、下記のように入力します。

```
[i番目のuser | Step4]["id"]
```

<figure><img src="/files/qag6ixCcwiYv7rIlpdsz" alt="" width="563"><figcaption></figcaption></figure>

以上で設定は終了です。テストして成功するか確認してください。

この設定により、ページネーションによりデータを取得することができました。


# 変数

## **変数と変数ウィンドウ**

変数は、トリガーやアクションなどのステップから出力されるデータのことです。

出力されたデータは変数ウィンドウから参照でき、別のステップで利用することができます。

<figure><img src="https://files.readme.io/6d3b1f0-variable-window.png" alt="1119"><figcaption><p>変数ウィンドウと変数</p></figcaption></figure>

例えば、Google Drive から取得したファイル名をSlackBotの `メッセージ内容` に割り当てることができます。

<figure><img src="https://files.readme.io/b742740-image.png" alt="Google Driveから取得したファイル名をメッセージ内容に割り当てる" width="600"><figcaption><p>Google Driveから取得したファイル名をメッセージ内容に割り当てる</p></figcaption></figure>

### **変数のサンプル値**

変数ウィンドウには、ソリューションを組む際にアプリからどのようなデータが返ってくるかを表示しています。

このサンプル値を参考にしながら、ソリューションを組むことができます。

<figure><img src="https://files.readme.io/d01d1eb-sample-output.png" alt="447"><figcaption><p>サンプル値の例</p></figcaption></figure>

## **型**

型には、以下の種類があります。\
`アイコン` の列に表示されているのは、変数ウィンドウで変数の左側に表示されるアイコンの画像です。

<figure><img src="https://files.readme.io/a8ad1dd-data-types.png" alt="435"><figcaption><p>型のアイコン</p></figcaption></figure>

<table><thead><tr><th width="136.859375">型の名前</th><th width="185.92578125">説明</th><th width="311.41796875">値の例</th><th width="43.48046875">アイコン</th></tr></thead><tbody><tr><td>String</td><td>文字列</td><td>abcdefg</td><td><img src="https://storage.googleapis.com/for-product-documents/data-types/String.png" alt="" data-size="original"></td></tr><tr><td>Integer</td><td>整数値</td><td>123456</td><td><img src="https://storage.googleapis.com/for-product-documents/data-types/Number.png" alt=""></td></tr><tr><td>Boolean</td><td>真偽値</td><td>True</td><td><img src="https://storage.googleapis.com/for-product-documents/data-types/Boolean.png" alt=""></td></tr><tr><td>Decimal</td><td>10進数の小数</td><td>0.123456</td><td><img src="https://storage.googleapis.com/for-product-documents/data-types/Integer.png" alt=""></td></tr><tr><td>Date</td><td>日付</td><td>2021-06-17</td><td><img src="https://storage.googleapis.com/for-product-documents/data-types/Date.png" alt=""></td></tr><tr><td>Datetime</td><td>日付 + 時刻</td><td>2021-06-17 22:23</td><td><img src="https://storage.googleapis.com/for-product-documents/data-types/date&#x26;time.png" alt=""></td></tr><tr><td>File</td><td>ファイル</td><td>ファイルのバイナリデータが入ります</td><td><img src="https://storage.googleapis.com/for-product-documents/data-types/Log.png" alt=""></td></tr><tr><td>Object</td><td>オブジェクト</td><td><code>{"name": "Anyflow Embed", "version": 2}</code></td><td><img src="https://storage.googleapis.com/for-product-documents/data-types/Object.png" alt=""></td></tr><tr><td>List</td><td>リスト</td><td><code>[“hello”, “anyflow”]</code></td><td><img src="https://storage.googleapis.com/for-product-documents/data-types/Array.png" alt=""></td></tr><tr><td>マッピング</td><td>オブジェクト in リスト。ウィザード上で、データのマッピングを行うための型</td><td><code>[ { “左カラム”: “左カラムの値”, “右カラム”: “右カラムの値” } ]</code></td><td><img src="https://storage.googleapis.com/for-product-documents/data-types/Array.png" alt=""></td></tr><tr><td>チェックボックス・複数選択アシスト・テーブルアシスト</td><td>リスト。ウィザード上で、チェックボックスで入力を受け付けるための型</td><td><code>["チェックが入った値1", "チェックが入った値2]</code></td><td><img src="https://storage.googleapis.com/for-product-documents/data-types/Array.png" alt=""></td></tr><tr><td>コンディション</td><td>オブジェクト。ウィザード上で、コンディション（条件）の入力を受け付けるための型</td><td><code>{ "かつ/または": "かつ/またはが入った値", "条件リスト": [ { "左辺": "左辺の値", "演算子": "演算子の値", "右辺": "右辺の値" } ] }</code></td><td><img src="https://storage.googleapis.com/for-product-documents/data-types/Object.png" alt=""></td></tr></tbody></table>

## **標準変数**

標準変数とは、Anyflowが標準的に用意している変数です。\
ソリューションの実行開始日時など、システム側で保有している値を利用することができます。

詳しくは[こちら](/solution-editor/variables/standard)を確認してください。

## **エンドユーザー変数**

エンドユーザー変数とは、ウィザードを介してエンドユーザーからの入力を受け取るための変数です。

詳しくは[こちら](/solution-editor/variables/enduser)を確認してください。


# 標準変数

### 標準変数

標準変数とは、Anyflowが標準的に用意している変数です。\
ソリューションの実行開始日時など、システム側で保有している値を利用することができます。

標準変数の値は、通常の変数と同様にソリューションの中で利用することができます。\
他のシステムにデータを渡すことや、エンドユーザー変数を元に条件分岐をすること、標準変数のデータを加工することなどが行えます。

<figure><img src="https://files.readme.io/927ebda6e17b30d3d151901b7c1f16fe5cc8905e2be0f23e02266f95cd7b435f-image.png" alt="" width="563"><figcaption></figcaption></figure>

利用できる標準変数は以下のとおりです。

<table><thead><tr><th width="207.65625">変数名</th><th>説明</th></tr></thead><tbody><tr><td>実行開始日時</td><td>ソリューションの実行が開始された日時です。ISO 8601の形式です。</td></tr><tr><td>実行履歴ID</td><td>実行履歴に割り振られたユニークIDです。<br>実行履歴の詳細を確認するためにも利用できます（詳しくは<a href="/pages/b6I5H0Wk1dWaWmOs2M6J">こちら</a>）</td></tr><tr><td>デプロイ環境ユニーク名</td><td><a href="/pages/Op9udC5mvzAh6XfaNRDq">デプロイ環境</a>のユニーク名です。<br>開発環境と本番環境でAPIリクエスト先を変更する場合にも利用できます。</td></tr><tr><td>anyflow_team_id</td><td><a href="/pages/J4Hx3bhqChCEzbaA2sd8">JWTのペイロード</a>に含まれる一意なエンドユーザーチームの識別子（anyflow_team_id）の値です。自身のプロダクトにて設定した値が入ります。</td></tr><tr><td>anyflow_user_id</td><td><a href="/pages/J4Hx3bhqChCEzbaA2sd8">JWTのペイロード</a>に含まれる一意なエンドユーザーの識別子（anyflow_user_id）の値です。自身のプロダクトにて設定した値が入ります。設定していない場合は入りません。</td></tr></tbody></table>


# エンドユーザー変数

エンドユーザー変数とは、ウィザードを介してエンドユーザーからの入力を受け取るための変数です。

受け取った値は、通常の変数と同様にソリューションの中で利用することができます。\
他のシステムにデータを渡すことや、エンドユーザー変数を元に条件分岐をすること、エンドユーザー変数のデータを加工することなどが行えます。

例: エンドユーザーから入力されたSlackのチャンネルにメッセージを投稿する、チェックボックスを使ってエンドユーザーの入力によってロジックを分岐させる等

[ウィザードでスクリーンにエンドユーザー変数を配置](/wizard-editor/about#endoyzno)し、ウィザードから入力された値は、エンドユーザー変数としてソリューション内で変数としてステップで利用できます。

エンドユーザー変数を作成するには、変数ウィンドウのエンドユーザー変数から、追加を押下します。

<figure><img src="https://files.readme.io/2f0e686-end-user_variable.png" alt=""><figcaption></figcaption></figure>

追加を押すと、以下のスクリーンショットのようなモーダルが表示されます。\
`エンドユーザー変数の名前` は、管理しやすいように好きな名前をつけてください。

[変数の型](/solution-editor/variables#xing) は、エンドユーザー変数を使用するステップの入力フィールドの型に合わせて作成する必要があります。

<figure><img src="https://files.readme.io/28742c4-end-user_variable_modal.png" alt=""><figcaption></figcaption></figure>

例えば、SlackBotアプリの、`メッセージを投稿` アクションの `投稿するチャンネル名` フィールドで受け付ける型はStringなので、エンドユーザー変数の型もStringで作成する必要があります。

<figure><img src="https://files.readme.io/aaba989-end-user_variable_type.png" alt=""><figcaption></figcaption></figure>

## **エンドユーザー変数を削除、編集する**

作成したエンドユーザー変数を編集、削除するためには、「︙」を押下することでメニューが表示されます。

<figure><img src="https://files.readme.io/5deeebb-end-user_variable_editremove.png" alt=""><figcaption></figcaption></figure>

{% hint style="danger" %}

### ヒント

ソリューション内のステップの入力フィールドで使われているエンドユーザー変数を削除した場合、ソリューションが正しく動作しない可能性がありますので、削除する際には注意して削除を行ってください。
{% endhint %}


# 共通仕様

共通仕様


# スキーマ定義

## json**概要**

スキーマJSONのモーダルでは、以下の様に各スキーマ定義を配列にまとめて一度に設定することができます。

```json
[
  {スキーマ定義},
  {スキーマ定義},
  {スキーマ定義}
]
```

<figure><img src="https://files.readme.io/6453a6f-image.png" alt=""><figcaption></figcaption></figure>

上記を入力して「生成する」を実施すると、3つの項目が生成されます。

<figure><img src="https://files.readme.io/438cf65-image.png" alt=""><figcaption></figcaption></figure>

1. string型でnameという名称の必須入力の項目

```json
{
    "type": "string",
    "name": "name",
    "optional": false
}
```

<br>

2. string型でcompanyという名称の必須入力の項目

```json
{
    "type": "string",
    "name": "company",
    "optional": false
}
```

<br>

3. boolean型でstatusという名称の任意入力の項目

```json
{
  "type": "boolean",json
  "name": "status",
  "optional": true
}
```

***

## **json仕様**

<table><thead><tr><th width="122.28515625">キー</th><th>値</th></tr></thead><tbody><tr><td>type</td><td>スキーマの型を指定します。型は以下から選択します。<br><code>string</code> , <code>boolean</code> , <code>integer</code>, <code>decimal</code>, <code>date</code> , <code>datetime</code>, <code>array</code>, <code>object</code></td></tr><tr><td>name</td><td>任意の名称を指定します。</td></tr><tr><td>optional</td><td>入力を任意にする場合はtrueを、必須の場合はfalseを指定します。</td></tr><tr><td>element</td><td><code>array</code>型の場合に使用します。<br>配列は、共通のスキーマを持つ複数の要素から構成されるため、その共通のスキーマを1つ定義します。</td></tr><tr><td>properties</td><td><code>object</code>型の場合に使用します。<br>オブジェクトは、複数のスキーマを持つ1つの要素のため、複数のスキーマを配列でまとめて定義します。</td></tr></tbody></table>

型ごとに仕様が決まっています。

`string` , `boolean` , `integer`, `decimal`, `date` , `datetime` の場合

```json
{
  type: "string" | "boolean" | "integer" | "decimal" | "date" | "datetime",
  name: "任意の名称",
  optional: true | false
}
```

`array` の場合

```json
{
  type: "array",
  name: "任意の名称",
  optional: true | false,
  element: Schema | null
}
```

`object` の場合

```json
{
  type: "object",
  name: "任意の名称",
  optional: true | false,
  properties: Schema[]
}
```


# 固定リストと動的リスト

## **概要**

一部のアクションでは、フィールドの設定する際に、入力としてリスト（変数）を設定します。\
（例:Salesforce,kintone,カオナビの一括挿入や一括更新、一括削除など）

<figure><img src="https://files.readme.io/2819f11-field-list-select-dynamic-lists.png" alt="575"><figcaption><p><code>リスト</code>の「︙」を押下すると、<code>固定リスト</code>か<code>動的リスト</code>を選択するウィンドウが表示されます。</p></figcaption></figure>

### **リストを設定する際の選択基準**

<table><thead><tr><th width="468.2890625">パターン</th><th>リスト</th></tr></thead><tbody><tr><td>フォームの総数と内容がわかっている場合</td><td>固定リスト</td></tr><tr><td>フォームの数と内容が他のリストに依存する場合</td><td>動的リスト</td></tr></tbody></table>

## **動的リスト**

アクションでリスト内のすべての項目を動的に反復し、すべての行の値を読み取る場合は、`動的リスト`を選択します。\
（例:10行のCSVファイルがある場合、動的リストはすべての行を反復処理し、各行のデータを使用してSalesforceに10個の新しいレコードを作成します。）

### **使い方**

リストで`動的リスト`を選択すると、`ソースリスト` というフィールドが入力可能になります。\
`リストソース`はリスト（変数）のみ設定可能です。

<figure><img src="https://files.readme.io/c70383b-list-source-mapping.png" alt="475"><figcaption><p><code>リストソース</code>で変数（マッピング）を設定します。</p></figcaption></figure>

<figure><img src="https://files.readme.io/a60a2cf-list-source-input.png" alt="959"><figcaption><p><code>リストソース</code>に設定した変数を選択します。</p></figcaption></figure>

リスト（変数）を使用すると、ソースするコネクタのオブジェクトリストから直接データを取得します。\
その後、リスト（変数）として取得した変数を使用して、以下フィールドをマッピングします。

<figure><img src="https://files.readme.io/2a14a4a-object-mapping.png" alt="961"><figcaption><p><code>マッピング</code>の<code>i番目のマッピング</code>から、対応するカラムを選択します。</p></figcaption></figure>

### **利用例**

#### **実行ボタンを押したユーザーの情報から、Salesforceでレコードを作成する場合の例**

実行ボタンを押したユーザーの情報を取得し、Salesforceでレコードを作成します。\
複数のデータがある場合に、全データをループし、値を取得する形となります。

**ソリューションでの設定方法**\
[こちら](#i)と同様の設定をします。\
エンドユーザー変数の詳細の設定方法については、[こちら](/solution-editor/about)をご確認ください。

<figure><img src="https://files.readme.io/a08a220-dynamic-lists-solution.png" alt=""><figcaption></figcaption></figure>

要素フィールドのオブジェクトを設定します。\
`フィールド名`と`値`が対応する形にします。

**ウィザードでの設定方法**\
ウィザードでは以下の設定が必要になります。

* [ウィザードを構築する](/wizard-editor/about)
* [エンドユーザー変数を設定する](/wizard-editor/widget)

***

## **固定リスト**

`動的リスト`とは対照的に、フォームの総数内容がわかっている場合は`固定リスト`を使用します。\
この場合、各項目が1つずつ追加されます。

<figure><img src="https://files.readme.io/23b62d4-field-list-select-fixed-lists.png" alt="575"><figcaption><p><code>リスト</code>の「︙」を押下し、<code>固定リスト</code>を選択します。</p></figcaption></figure>

### **使い方**

`固定リスト`は、リスト内の各項目を 1 つずつ追加してマッピングする必要があります。\
エンドユーザー変数や、他アクション/トリガーで取得した情報を、変数ウィンドウから選択し設定します。

<figure><img src="https://files.readme.io/f3e9449-fixed-lists-mapping.png" alt="574"><figcaption><p>対応する<code>フィールド名</code>と<code>値</code>を設定します。</p></figcaption></figure>

### **利用例**

#### **実行ボタンを押したユーザーの情報から、Salesforceでレコードを作成する場合の例**

実行ボタンを押したユーザーの情報を取得し、Salesforceでレコードを作成します。

**ソリューションでの設定方法**\
[こちら](#i-1)と同様の設定をします。\
エンドユーザー変数の詳細の設定方法については、[こちら](/solution-editor/about)をご確認ください。

<figure><img src="https://files.readme.io/5f96f0e-fixed-lists-mapping-example.png" alt="539"><figcaption><p>各項目を1つずつ設定します。</p></figcaption></figure>

アイテムを追加したい場合は、`追加`ボタンを押下し、同様の設定を行います。

<figure><img src="https://files.readme.io/34b75ef-fixed-lists-mapping-add.png" alt=""><figcaption></figcaption></figure>

**ウィザードでの設定方法**\
ウィザードでは以下の設定が必要になります。

* [ウィザードを構築する](/wizard-editor/about)
* [エンドユーザー変数を設定する](/wizard-editor/widget)

今回は、Salesforceのオブジェクトとフィールドの設定には、`アシスト`を使用します。\
ソリューションで設定したアイテムの`フィールド`と`値`が対応する形で設定します。

これにより、エンドユーザー側でオブジェクトとフィールドを検索し、選択することが可能です。

<figure><img src="https://files.readme.io/94f5bab-fixed-lists-assist.png" alt="1440"><figcaption><p>エンドユーザーのオブジェクトとフィールドの選択画面</p></figcaption></figure>


# Formula

Formulaの設定方法について

## 概要

Anyflow Embedでは、Formulaを使用してデータを加工/変換することが可能です。\
FormulaはPythonによって記述することができます。

## 入力フィールドでFormulaを利用する方法

Formulaは、ほとんどの入力フィールドで利用可能です。\
Formulaを使うためには、Formulaモードにする必要があります。

入力フィールドの左側をクリックすると背景色が変わりFormulaモードに切り替わります。\
また、左側のタイプアイコンも`fx`アイコンに変更されます。

<figure><img src="https://files.readme.io/76c34c6-Formula1.gif" alt="760" width="563"><figcaption><p>Formulaモードは<code>fx</code>マークで表示されます</p></figcaption></figure>

## 使用可能な記法

<details>

<summary>基本定数</summary>

* `None`：null（値が存在しない）を示す定数
* `True` / `False`：真または偽を表す真偽値定数

</details>

<details>

<summary>型変換</summary>

* `bool(x)`：真偽値に変換する
* `str(x)`：文字列に変換する
* `int(x)`：整数に変換する
* `float(x)`：浮動小数点数に変換する
* `chr(x)`：Unicodeコードを文字に変換
* `ord(x)`：文字をUnicodeコードに変換
* `hex(x)`：16進数文字列に変換
* `oct(x)`：8進数文字列に変換
* `json_dumps(obj)`：オブジェクトをJSON形式の文字列に変換
* `json_loads(str)`：JSON文字列をオブジェクトに変換

</details>

<details>

<summary>数字</summary>

* `abs(x)`：x の絶対値を返す
* `max(iterable)`：最大値を返す
* `min(iterable)`：最小値を返す
* `sum(iterable)`：合計値を返す
* `pow(x, y)`：x の y 乗を返す
* `round(x)`：x を四捨五入して返す
* `floor(x)`：x を切り捨てる（小数点以下切り捨て）
* `ceil(x)`：x を切り上げる（小数点以下切り上げ）
* `all(iterable)`：すべての要素が真なら True を返す
* `any(iterable)`：いずれかの要素が真なら True を返す

</details>

<details>

<summary>文字列</summary>

#### 関数

* `re.search(pattern, string)`：正規表現で部分一致検索
* `re.sub(pattern, repl, string)`：正規表現による文字列置換
* `zenkaku_to_hankaku(str)`：【Anyflow独自関数】 全角文字を半角に変換
* `hankaku_to_zenkaku(str)`：【Anyflow独自関数】 半角文字を全角に変換

#### 大文字・小文字変換メソッド

* `.lower()`：すべて小文字に変換
* `.upper()`：すべて大文字に変換
* `.capitalize()`：先頭のみ大文字、他は小文字に変換
* `.title()`：各単語の先頭を大文字に
* `.swapcase()`：大文字と小文字を反転
* `.casefold()`：比較用の小文字変換（より厳密）

#### 配置・埋め込みメソッド

* `.center(width)`：中央寄せで文字列を埋める
* `.ljust(width)`：左寄せで埋める
* `.rjust(width)`：右寄せで埋める
* `.zfill(width)`：左側をゼロで埋める

#### 検索・位置取得メソッド

* `.find(sub)`：部分文字列の位置（見つからなければ -1）
* `.rfind(sub)`：右から検索
* `.index(sub)`：見つからなければエラー
* `.rindex(sub)`：右からの位置（エラー有）
* `.count(sub)`：出現回数

#### 判定系メソッド

* `.startswith(prefix)`：指定文字で始まるか
* `.endswith(suffix)`：指定文字で終わるか
* `.isalnum()`：英数字かどうか
* `.isalpha()`：アルファベットかどうか
* `.isascii()`：ASCII 文字かどうか
* `.isdecimal()`：10進数字か
* `.isnumeric()`：数値文字か
* `.isspace()`：空白のみか
* `.islower()`：すべて小文字か
* `.isupper()`：すべて大文字か
* `.istitle()`：タイトル形式か

#### 分割・結合メソッド

* `.split(sep)`：区切りで分割
* `.rsplit(sep)`：右から分割
* `.splitlines()`：改行で分割
* `.partition(sep)`：最初の区切りで3つに分割
* `.rpartition(sep)`：右からの区切りで分割
* `"sep".join(iterable)`：文字列のリストを結合

#### 変更・整形メソッド

* `.replace(old, new)`：文字列の置換
* `.strip(chars)`：前後の指定文字を削除
* `.lstrip(chars)`：左端を削除
* `.rstrip(chars)`：右端を削除
* `.expandtabs(n)`：タブをスペースに変換

</details>

<details>

<summary>配列・辞書</summary>

* `len(x)`：要素数を返す
* `list(x)`：リストに変換する
* `dict(x)`：辞書に変換する
* `tuple(x)`：タプルに変換する
* `set(x)`：集合に変換する（重複を削除）
* `zip(a, b)`：複数の配列を要素ごとに結合
* `enumerate(x)`：インデックスと要素のペアを生成
* `range(n)`：整数の範囲を生成（0 から n-1 まで）
* `sorted(x)`：並び替えたリストを返す
* `groupby(iterable)`：【Anyflow独自関数】 指定キーでグループ化
* `get_first(list)`：【Anyflow独自関数】 リストの先頭要素を返す

</details>

<details>

<summary>日付・時間</summary>

#### 関数

* `str_to_date(str)`：【Anyflow独自関数】 文字列を日付型に変換
* `str_to_datetime(str)`：【Anyflow独自関数】 文字列を日時型に変換
* `utcnow()`：【Anyflow独自関数】 UTC 現在時刻を返す
* `jstnow()`：【Anyflow独自関数】 日本時間の現在時刻を返す

#### メソッド

* `.add(**kwargs)`：指定した時間を加算（例：`add(days=3)`）
* `.subtract(**kwargs)`：指定した時間を減算
* `.start_of("unit")`：指定単位（"day", "month" 等）の開始時刻を取得
* `.end_of("unit")`：指定単位の終了時刻を取得
* `.format(format_string)`：指定書式で文字列に変換
* `.isoformat()`：ISO 8601 形式で出力
* `.is_future()`：未来の日付かどうか判定
* `.is_past()`：過去の日付かどうか判定
* `.weekday()`：曜日を数値（0〜6）で返す
* `.in_timezone("Asia/Tokyo")`：タイムゾーンを変換
* `.is_dst()`：夏時間かどうか判定
* `.is_utc()`：UTCかどうか判定

#### 共通属性（日時・日付どちらでも使用可能）

* `.day`：日（1〜31）
* `.month`：月（1〜12）
* `.year`：年（例：2025）
* `.quarter`：四半期（1〜4）
* `.day_of_week`：曜日（0=月曜日, 6=日曜日）
* `.day_of_year`：年初からの日数（1〜366）
* `.week_of_month`：月の週番号（1〜5程度）
* `.week_of_year`：年の週番号（ISO 8601形式：1〜53）
* `.days_in_month`：その月の日数（28〜31）

#### 時間属性（日時オブジェクトのみ使用可能）

* `.hour`：時（0〜23）
* `.minute`：分（0〜59）
* `.second`：秒（0〜59）
* `.microsecond`：マイクロ秒（0〜999999）
* `.int_timestamp`：UNIXタイムスタンプ（整数）
* `.float_timestamp`：UNIXタイムスタンプ（小数点付き）
* `.offset`：UTCからの秒単位オフセット（例：+32400秒）
* `.offset_hours`：UTCからの時間単位オフセット（例：+9.0）
* `.timezone_name`：タイムゾーン名（例：`"Asia/Tokyo"`）

</details>

<details>

<summary>エンコーディング・暗号化</summary>

#### 関数

* `b64encode(str)`：【Anyflow独自関数】 Base64 で文字列をエンコード
* `b64decode(str)`：【Anyflow独自関数】 Base64 でデコード
* `quote(str)`：【Anyflow独自関数】 URLエンコード
* `unquote(str)`：【Anyflow独自関数】 URLデコード
* `hmac.new(key, msg, digestmod)`：HMAC署名を作成

#### メソッド

* `.encode()`：文字列をバイト列に変換
* `.decode()`：バイト列を文字列に変換

</details>

<details>

<summary>CSV</summary>

#### 関数

* `csv.reader(csvfile, delimite, quotechar, quoting)`：CSVリーダーオブジェクトを返す（イテレータ形式、全行取得には.to\_list()を使用）
* `csv.DictReader(csvfile, fieldnames, delimiter, quotechar, quoting)`：CSVの各行を辞書となっている、CSV DictReaderオブジェクトを返す（イテレータ形式、全行取得には.to\_list()を使用）
* `csv.Sniffer().sniff(sample, delimiters)`：与えられたサンプル文字列から、区切り文字や引用符などの CSV フォーマットを推定する。
* `csv.field_size_limit()`：フィールドの最大サイズ制限を取得する（読み取り専用）

#### 定数

* `csv.QUOTE_ALL`：すべてのフィールドを引用符で囲む
* `csv.QUOTE_MINIMAL`：必要な場合のみ引用符で囲む（デフォルト）
* `csv.QUOTE_NONE`：引用符を一切使用しない
* `csv.QUOTE_NONNUMERIC`：数値以外のフィールドを引用符で囲み、読み込み時は数値に変換

#### クラス・ダイアレクト

* `csv.Error`：CSVパースエラー時に送出される例外クラス
* `csv.excel`：Excel形式に対応したダイアレクト（区切り文字はカンマ）
* `csv.excel_tab`：Excelのタブ区切り形式に対応したダイアレクト
* `csv.unix_dialect`：UNIXスタイルのCSV形式に対応したダイアレクト（カンマ区切り、ダブルクオート引用）

</details>

<details>

<summary>その他</summary>

* `condition(condition, true_value, false_value)`：【Anyflow独自関数】 条件式に応じた値を返す（三項演算子）

</details>


# ウィザードエディタとは

## 概要

<figure><img src="https://files.readme.io/2ccc2ae-wizard_editor.png" alt="3152"><figcaption><p>ウィザードエディター</p></figcaption></figure>

ウィザードエディターは、ウィザードに表示するテキストや、エンドユーザーの設定項目を制御するためのものです。

## ウィザードに表示される項目を編集する

<figure><img src="https://files.readme.io/bb8edc6-field.png" alt=""><figcaption></figcaption></figure>

左ペインに表示されているのは、アウトラインです。\
①を押下する、もしくはスクリーンに表示されている②を押下することで、項目が選択状態になります。\
項目を選択状態にした上で、右ペインの③から項目を編集することができます。

{% hint style="success" %}

### ヒント

「スクリーンの説明」「フィールドの説明」等の説明文を記載する箇所は、Markdownで記述できます。\
使用できるMarkdown記法は[こちら](/wizard-editor/advanced-setting/markdown)をご確認ください。
{% endhint %}

## スクリーンの追加と削除

スクリーンは自由に追加と削除を行うことができます。\
エンドユーザーに設定してもらう項目が増えた場合などは、スクリーンを適宜増やすことで入力のしやすさを向上させることができます。

<figure><img src="https://files.readme.io/3519d5a-add_screen.png" alt="1263" width="563"><figcaption><p>スクリーンの追加</p></figcaption></figure>

<figure><img src="https://files.readme.io/1c770b1-remove_screen.png" alt="1262" width="563"><figcaption><p>スクリーンの削除</p></figcaption></figure>

## 認証ボタンの設置

ソリューションエディターで選択したコネクタの認証ボタンをウィザードに配置し、エンドユーザーにアカウント認証を促します。

<figure><img src="https://files.readme.io/82e0fbf-account_verification.png" alt="" width="563"><figcaption></figcaption></figure>

## エンドユーザー変数の設置

ソリューションエディターで作成した[エンドユーザー変数](/solution-editor/variables/enduser)をウィザードに表示し、エンドユーザーに入力を促すためには、ウィザードエディターの左ペインの下部にある**エンドユーザーの設定項目ウィンドウ**を表示します。

<figure><img src="https://files.readme.io/0a14f6e-end-user-variable-window.png" alt="" width="375"><figcaption></figcaption></figure>

エンドユーザーの設定項目ウィンドウには、ソリューションエディターで作成したエンドユーザー変数の一覧と、ソリューション内で利用されているアプリのコネクションが表示されます。

基本的には、 エンドユーザーの設定項目ウィンドウに表示されている項目は、すべてスクリーンに配置することが想定されます。

{% hint style="warning" %}
ソリューションで利用しているコネクションやエンドユーザー変数がスクリーンに配置されていない場合、ソリューションが正しく動作しない可能性がありますので注意してください。
{% endhint %}

エンドユーザーの設定項目をスクリーンに配置するためには、各項目の「︙」を押下し、配置するスクリーンを選びます。

<figure><img src="https://files.readme.io/0b82ac8-end-user-variable-assign-screen.png" alt="774" width="375"><figcaption><p>エンドユーザーの設定項目をスクリーンに配置する</p></figcaption></figure>

「︙」を押下すると、スクリーンの番号が表示されます。配置したいスクリーンを押下することで、スクリーンに配置されます。

また、配置したいスクリーン以外に誤って項目を配置してしまった場合、左ペインの項目の「︙」から配置を解除することが可能です。

<figure><img src="https://files.readme.io/5fe0012-detach-end-user-variable.png" alt="705" width="375"><figcaption><p>エンドユーザーの設定項目をスクリーンから解除する</p></figcaption></figure>


# ウィジェット

## 概要

ウィザードでは、エンドユーザーがスムーズに値を入力できるように、\
項目ごとに適切な入力方法を提供する必要があります。

例えば：

* Slackのチャンネルを手入力させるのではなく、一覧から選択させる
* ◯◯の場合は✗✗する などの複雑な条件設定を指定できるようにする

Anyflowでは様々な入力ウィジェットを提供しており、状況に合わせて適切なものを選択できます。

<figure><img src="https://files.readme.io/5c1b32e-end-user-variable-input-type.png" alt="1675"><figcaption><p>ウィジェットの指定方法</p></figcaption></figure>

## ウィジェットの種類

### 基本的な入力ウィジェット

一部のエンドユーザー変数を除き、多くのエンドユーザー変数で入力方法として選択できます。

<table><thead><tr><th width="156.421875">入力方法</th><th>説明</th></tr></thead><tbody><tr><td>テキスト</td><td>一般的なテキストウィジェットです。</td></tr><tr><td>パスワード</td><td>入力した文字がマスキングされるため、パスワードや秘密情報を入力するのに適したウィジェットです。</td></tr><tr><td>セレクト</td><td>固定の選択肢の中から選択するためのウィジェットです。</td></tr><tr><td>アシスト</td><td>関連するコネクタのAPIを呼び出して、エンドユーザーごとに固有な選択肢を動的に提示するためのウィジェットです。</td></tr><tr><td>カレンダー</td><td>カレンダーの中から日付の入力をするためのウィジェットです。</td></tr><tr><td>CSV</td><td>CSV（ファイル全体）をエンドユーザーがアップロードするためのウィジェットです。</td></tr><tr><td>CSV項目定義</td><td>CSVの項目（ヘッダー）をエンドユーザーが定義するためのウィジェットです。</td></tr><tr><td>CSV項目選択</td><td>CSVの項目（ヘッダー）をエンドユーザーが選択するためのウィジェットです。</td></tr></tbody></table>

### 応用的な入力ウィジェット

エンドユーザー変数が特定の型の場合のみ利用できます。

| エンドユーザー変数の型                | 入力方法                       | 説明                              |
| -------------------------- | -------------------------- | ------------------------------- |
| マッピング                      | マッピング                      | 異なるアプリでデータのマッピングを行うためのウィジェットです。 |
| チェックボックス/複数選択アシスト/テーブルアシスト | チェックボックス/複数選択アシスト/テーブルアシスト | 固定の選択肢の中から、複数選択が可能なウィジェットです。    |
| コンディション                    | コンディション                    | 条件のルールを入力を受け付けるためのウィジェットです。     |

エンドユーザー変数の型がこれらの場合は、入力方法はこの表に記載の方法に制限されます。

<figure><img src="https://files.readme.io/f9c84af-image.png" alt="型がマッピングの変数では、入力方法はマッピングしか選択できない" width="600"><figcaption><p>型がマッピングの変数では、入力方法はマッピングしか選択できない</p></figcaption></figure>

ただしマッピングウィジェットの中に表示される入力ウィジェットについては、「基本的な入力ウィジェット」を選択することができます。

<figure><img src="https://files.readme.io/533536e-image.png" alt="マッピングの左/右カラムでは、基本的な入力方法を選択できる" width="600"><figcaption><p>マッピングの左/右カラムでは、基本的な入力方法を選択できる</p></figcaption></figure>

## 各ウィジェットの詳細

### テキスト

一般的なテキストウィジェットです。

<figure><img src="https://files.readme.io/c7252e1-image.png" alt="" width="375"><figcaption></figcaption></figure>

{% hint style="success" %}

### 入力パターンを設定する方法

正規表現を記述することで、エンドユーザーがテキストウィジェットに入力する際の入力パターンを定義できます。詳しくはこちら
{% endhint %}

### パスワード

入力した文字がマスキングされるため、パスワードや秘密情報を入力するのに適したウィジェットです。

<figure><img src="https://files.readme.io/29a3bf5-image.png" alt="" width="375"><figcaption></figcaption></figure>

### セレクト

固定の選択肢の中から選択するためのセレクトウィジェットです。

選択肢は「オプション」の欄で追加します。

<figure><img src="https://files.readme.io/c247598-image.png" alt="" width="375"><figcaption></figcaption></figure>

### アシスト

関連するコネクタのAPIを呼び出して、エンドユーザーごとに固有な選択肢を動的に提示します。\
例えば以下の設定ではエンドユーザーのSlackワークスペースに存在するチャンネル名の一覧を提示します。

<figure><img src="https://files.readme.io/a4ea039-image.png" alt="" width="375"><figcaption></figcaption></figure>

アシストの詳細は[こちら](/wizard-editor/widget/assist)を確認してください。

### カレンダー

カレンダーの中から日付の入力をするためのウィジェットです。

<figure><img src="https://files.readme.io/485a4abde875ea465faff84690413012504b939b77be41aaceff9dc041bcd26d-image.png" alt="" width="375"><figcaption></figcaption></figure>

### CSV

エンドユーザーからCSVファイルのアップロードを受け付け、中身を文字列としてソリューション内で利用することができます。

<figure><img src="https://files.readme.io/5f5c08e01bd53542e37099ec5e2465b3b238113ce5a4339052522436cec4c1e6-image.png" alt="" width="563"><figcaption><p>CSVアップロード前</p></figcaption></figure>

<figure><img src="https://files.readme.io/2180743e8005de5ddf83179e4ec0b4a01bdeaa99ef733d01b1fa75d2bbe1658e-image.png" alt="" width="563"><figcaption><p>CSVアップロード後</p></figcaption></figure>

CSVについて、詳細は[こちら](/wizard-editor/widget/csv)を確認してください。

### CSV項目

「CSV項目**定義**」と「CSV項目**選択**」はセットで利用します。

エンドユーザーが「定義」ウィジェットでCSVファイルをアップロードできます。

<figure><img src="https://files.readme.io/4574976-image.png" alt="" width="375"><figcaption></figcaption></figure>

アップロードをすると、その項目（ヘッダー）がウィザードに読み込まれます。

<figure><img src="https://files.readme.io/5ef4198-image.png" alt="" width="375"><figcaption></figcaption></figure>

その後「選択」ウィジェットで、読み込んだ項目（ヘッダー）をエンドユーザーが**選択**できます。

<figure><img src="https://files.readme.io/8f7dd5c-image.png" alt="" width="375"><figcaption></figcaption></figure>

CSV項目定義やCSV項目選択について、詳細は[こちら](/wizard-editor/widget/csv-header)を確認してください。

### マッピング

異なるアプリでデータのマッピングを行うためのウィジェットです。\
エンドユーザー変数の型&#x304C;**「マッピング」**&#x306E;場合に利用できます。

以下の例では、HubSpotとSalesforceのフィールドの紐づけを行っています。

<figure><img src="https://files.readme.io/4925bf3-image.png" alt="" width="563"><figcaption></figcaption></figure>

マッピングの詳細は[こちら](/wizard-editor/widget/mapping)を確認してください。

### チェックボックス

チェックボックスは、複数選択が可能なウィジェットです。\
エンドユーザー変数の型&#x304C;**「チェックボックス/複数選択アシスト/テーブルアシスト」**&#x306E;場合に利用できます。

<figure><img src="https://files.readme.io/73d9931-checkbox-wizard-editor.png" alt="" width="563"><figcaption></figcaption></figure>

チェックボックスの詳細は[こちら](/wizard-editor/widget/checkbox)を確認してください。

### 複数選択アシスト

複数選択アシストを選択すると、単体ではなく複数のアシストのデータを選択することが可能です。

エンドユーザー変数の型&#x304C;**「チェックボックス/複数選択アシスト/テーブルアシスト」**&#x306E;場合に利用できます。

<figure><img src="https://files.readme.io/481a360-Screen_Shot_2023-03-22_at_6.00.13_PM.png" alt="568" width="375"><figcaption><p>複数選択アシストを設定し、Slackのチャンネル一覧を複数選択する例</p></figcaption></figure>

複数選択アシストの詳細は[こちら](/wizard-editor/widget/multi-select-assist)を確認してください。

### テーブルアシスト

テーブルアシストは、テーブル形式でエンドユーザーが項目を選択することが可能なウィジェットです。

エンドユーザー変数の型&#x304C;**「チェックボックス/複数選択アシスト/テーブルアシスト」**&#x306E;場合に利用できます。

<figure><img src="https://files.readme.io/76d8564d2b8669d91729cd2e45c66907e9e7d45a3a519d8bae5b6405ea11162b-image.png" alt="" width="563"><figcaption></figcaption></figure>

テーブルアシストの詳細は[こちら](/wizard-editor/widget/table-assist)を確認してください。

### コンディション

条件のルールを入力を受け付けるためのウィジェットです。\
エンドユーザー変数の型&#x304C;**「コンディション」**&#x306E;場合に利用できます。

<figure><img src="https://files.readme.io/399d3c0-image.png" alt="" width="563"><figcaption></figcaption></figure>

コンディションの詳細は[こちら](/wizard-editor/widget/condition)を確認してください。


# アシスト

## 概要

アシストは、対象SaaSのAPIを呼び出して動的にエンドユーザーに選択肢を提示するウィジェットです。

エンドユーザーごとに異なるSlackのチャンネル名、Salesforceのフィールド、GoogleDriveのフォルダ一覧、スプレッドシート一覧などを選択肢として表示し、エンドユーザーがそこから選択を行うことができます。

以下の例は、Slackのチャンネル名一覧をエンドユーザーがウィザードで選択する画面です。

<figure><img src="https://files.readme.io/aa37cf5-assist-sample.png" alt="605" width="375"><figcaption><p>アシストの例</p></figcaption></figure>

## 使い方

ウィザードエディターでアシストを使うためには、エンドユーザー変数の入力方法をアシストに選択します。\
入力方法をアシストに選択すると以下のスクリーンショットのように、「どのアシストを使うのか」を選択することができます。

<figure><img src="https://files.readme.io/0e6962d-assist.png" alt="362" width="375"><figcaption><p>どのアシストを使うのかを選択する画面</p></figcaption></figure>

アシストは、ソリューションの中で使用しているコネクタの中から選択することができます。

選択された値は、他のエンドユーザー変数と同様にソリューション内で利用できます。

<figure><img src="https://files.readme.io/aee4ac2-image.png" alt=""><figcaption></figcaption></figure>

ただしアシストでは、エンドユーザーに表示される文字列（ラベル）とソリューション内で使用する値は基本的に異なります。

例えばスプレッドシートの「スプレッドシート一覧」アシストでは、\
**エンドユーザーへの表示：スプレッドシート名（無題のスプレッドシート 等）**\
**ソリューション内での値：スプレッドシートID（1blz3HY........ 等）**\
となります。

{% hint style="warning" %}

### アシストを使う場合の注意点

エンドユーザーがアシストで選択した値は、Anyflow Embed のシステムにより**静的**に保存されます。エンドユーザーがウィザードの設定を済ませた後は、選択された値を固定値としてソリューションを実行します。

これにより、**連携先SaaSの中で**アシストで選択した値が削除されるなどの理由で**無効**となった場合、ソリューションがエラーとなる可能性があります。\
例えばSlackチャンネルをアシストで指定した後で、そのSlackチャンネルが削除された場合はソリューションがエラーとなります。

これを防ぐためには、ソリューションの中で [ifステップ](/solution-editor/logic/if) や [エラー監視ステップ](/solution-editor/logic/error-monitoring) を使い、無効な値が指定されても回避できるように設計を行ってください。\
ご不明な点があればAnyflow CSチームにご連絡ください。
{% endhint %}

### 依存関係が存在するアシストについて

アシストによっては、依存関係が存在するものがあります。\
例えば、スプレッドシートのシート一覧取得アシストを選択すると、以下のスクリーンショットのように表示されます。

<figure><img src="https://files.readme.io/8df37dd-dependence-assist.png" alt="" width="375"><figcaption></figcaption></figure>

アシストによって、赤枠で囲っている部分が変わります。\
スプレッドシートのシートは、以下のスクリーンショットのように、スプレッドシートに依存しています。

<figure><img src="https://files.readme.io/a91f408-google_sheets.jpg" alt="" width="563"><figcaption></figcaption></figure>

したがって、スプレッドシートのシートの一覧を取得するためには、親であるスプレッドシートを指定する必要があります。

以下のスクリーンショットの例では、スクリーン1に配置されている `スプレッドシート` というエンドユーザー変数を選択します。

スクリーン1 に配置されている`スプレッドシート` というエンドユーザー変数には、スプレッドシート一覧のアシストが設定されているため、スプレッドシートの情報がエンドユーザーから入力され、スプレッドシートのシートの一覧がアシストできるようになります。<br>

<figure><img src="https://files.readme.io/0b0b70a-assist-field-path.png" alt="" width="375"><figcaption></figcaption></figure>


# 複数選択アシスト

## 概要

複数選択アシストは、エンドユーザーが単体ではなく複数のアシストのデータを選択できるウィジェットです。

[アシスト](/wizard-editor/widget/assist)と同様に、対象SaaSのAPIを呼び出してエンドユーザーごとに異なる値を動的に表示します。

<figure><img src="https://files.readme.io/481a360-Screen_Shot_2023-03-22_at_6.00.13_PM.png" alt="568" width="375"><figcaption><p>Slackのチャンネル一覧を複数選択する例</p></figcaption></figure>

エンドユーザー変数の型&#x304C;**「チェックボックス/複数選択アシスト/テーブルアシスト」**&#x306E;場合に利用できます。

<figure><img src="https://files.readme.io/b3ec973-image.png" alt="" width="563"><figcaption></figcaption></figure>

## 使用例

以下の例では、Slackのチャンネル/ユーザー一覧を複数選択できるように設定しています。

<figure><img src="https://files.readme.io/ebba7b8-image.png" alt="" width="563"><figcaption></figcaption></figure>

選択された値は、配列形式で格納されソリューション内で利用できます。

<figure><img src="https://files.readme.io/893aceb-image.png" alt="" width="375"><figcaption></figcaption></figure>

```json
['C067RFPG0A3', 'U0684N2QFEX']
```

{% hint style="success" %}

### ヒント

アシストでは、エンドユーザーに表示される文字列（ラベル）とソリューション内で使用する値は基本的に異なります。

SlackBotの「チャンネル/ユーザ一覧」アシストでは、\
エンドユーザーへの表示：チャンネル名やユーザー名　（#general, @taro 等）\
ソリューション内での値：チャンネルID　（C067RFPG0A3, U0684N2QFEX 等）\
となります。
{% endhint %}

[繰り返しステップ](/solution-editor/logic/loop)を使って、エンドユーザーが選択した全てのチャンネルにSlackメッセージを投稿します。

「繰り返すリスト」にエンドユーザー変数（チャンネルIDの配列）を指定します。

<figure><img src="https://files.readme.io/f00e703-image.png" alt="" width="563"><figcaption></figcaption></figure>

繰り返しステップの中でSlackBotの「メッセージを投稿」アクションを設定し、

「投稿するチャンネル」には繰り返しの「選択された値」を指定します。

<figure><img src="https://files.readme.io/bbf9dab-image.png" alt="" width="563"><figcaption></figcaption></figure>

これにより、エンドユーザーが選択した複数のチャンネルに対してメッセージを投稿できます。


# テーブルアシスト

## 概要

テーブルアシストは、エンドユーザーがテーブル形式で項目を選択することが可能なウィジェットです。\
[アシスト](/wizard-editor/widget/assist)と同様に、対象SaaSのAPIを呼び出してエンドユーザーごとに異なる値を動的に表示します。

<figure><img src="https://files.readme.io/76d8564d2b8669d91729cd2e45c66907e9e7d45a3a519d8bae5b6405ea11162b-image.png" alt="" width="563"><figcaption></figcaption></figure>

## 絞り込みについて

表示件数が多い場合は、「絞り込み」を使うことで条件に合ったデータのみに絞り込むことができます。

<figure><img src="https://files.readme.io/29501692450e44c93bdbd7b0dd115112a03adbbd78757754d1fa058336c1b0fb-image.png" alt="" width="563"><figcaption></figcaption></figure>

条件式は、「かつ」 or「または」どちらかで連結することができます。両方を併用することはできません。

可能：A かつ B かつ C\
不可能：A かつ B `または` C

現在利用できる条件は以下のとおりです。

<table><thead><tr><th width="227.66015625">条件</th><th width="180.625">入力方法</th></tr></thead><tbody><tr><td>を含む / 含まない</td><td>文字列</td></tr><tr><td>と等しい / 等しくない</td><td>文字列</td></tr><tr><td>より大きい / 小さい</td><td>数字</td></tr><tr><td>以上 / 以下</td><td>数字</td></tr><tr><td>より前の日付 / 後の日付</td><td>カレンダー</td></tr></tbody></table>

## 管理画面での設定方法

エンドユーザー変数の型&#x304C;**「チェックボックス/複数選択アシスト/テーブルアシスト」**&#x306E;場合に利用できます。

<figure><img src="https://files.readme.io/b3ec973-image.png" alt="" width="563"><figcaption></figcaption></figure>

テーブルアシストで表示される項目や、順序についてはウィザードエディターにて設定を行うことが可能です。

<figure><img src="https://files.readme.io/51fee47-Screen_Shot_2023-08-28_at_2.18.55_PM.png" alt="右ペインから、項目（カラム）の入れ替えや表示、非表示の設定を行うことが可能" width="600"><figcaption><p>右ペインから、項目（カラム）の入れ替えや表示、非表示の設定を行うことが可能</p></figcaption></figure>

エンドユーザーが選択した値は、配列形式で格納されソリューション内で使用できます。

<figure><img src="https://files.readme.io/fb133af-image.png" alt="" width="375"><figcaption></figcaption></figure>

```json
['0762970a-1064-4a9b-9dee-a4b28beae27c', '0a5134d5-74a8-4e83-983e-cf2802a2a6f4']
```

{% hint style="success" %}

### ヒント

アシストでは、エンドユーザーに表示される文字列（ラベル）とソリューション内で使用する値は基本的に異なります。

SmartHRの「従業員一覧」のテーブルアシストでは、\
エンドユーザーへの表示：社員番号・氏名・部署などの情報\
ソリューション内での値：従業員ID\
となります。
{% endhint %}

## 使用例

以下の例では、[繰り返しステップ](/solution-editor/logic/loop)を使って、エンドユーザーが選択した全ての従業員の情報を取得する方法を紹介します。

「繰り返すリスト」にエンドユーザー変数（従業員IDの配列）を指定します。

<figure><img src="https://files.readme.io/1e4e5c4-image.png" alt=""><figcaption></figcaption></figure>

繰り返しステップの中でSmartHRの「従業員を取得」アクションを設定し、

「従業員ID」には繰り返しの「選択された値」を指定します。

<figure><img src="https://files.readme.io/41485a9-image.png" alt=""><figcaption></figcaption></figure>

これにより、エンドユーザーが選択した全ての従業員の情報を取得できます。


# チェックボックス

## 概要

チェックボックスは、予め決められた選択肢の中からエンドユーザーが複数選択できるウィジェットです。

<figure><img src="https://files.readme.io/73d9931-checkbox-wizard-editor.png" alt="" width="563"><figcaption></figcaption></figure>

エンドユーザー変数の型&#x304C;**「チェックボックス/複数選択アシスト/テーブルアシスト」**&#x306E;場合に利用できます。

<figure><img src="https://files.readme.io/b3ec973-image.png" alt="" width="563"><figcaption></figcaption></figure>

## 使用例

以下のスクリーンショットの例では、チェックボックスの項目を2つ追加し、`Slackに投稿する` にチェックが入っていた場合、`1` を、`Slackに投稿しない` にチェックが入っていた場合 `2` が値として入るように設定しています。

<figure><img src="https://files.readme.io/73d9931-checkbox-wizard-editor.png" alt="" width="563"><figcaption></figcaption></figure>

例としてソリューションエディターで、以下のスクリーンショットのようなロジックを構築しました。

<figure><img src="https://files.readme.io/703842f-checkbox-solution-editor.png" alt="" width="563"><figcaption></figcaption></figure>

チェックボックスは、リストで値が入ってくる ので、チェックボックスのアイテムを繰り返しアクションによって繰り返しています。\
繰り返しアクションの中で if を用いて、`1` と等しい場合に、Slackにメッセージを送信するようになっています。

`1` はウィザードエディターで `Slackに投稿する` 場合に `1` が値として入ってくる設定をしているため、`Slackに投稿する` にチェックが入っていた場合、Slackに投稿されます。


# マッピング

## 概要

マッピングは、異なるコネクタ間でデータの紐づけを行うためのウィジェットです。\
以下の例では、HubSpotとSalesforceのフィールドの紐づけを行っています。

<figure><img src="https://files.readme.io/4925bf3-image.png" alt="" width="563"><figcaption></figcaption></figure>

{% hint style="success" %}

### ヒント

エンドユーザーは「行を追加」を行うことで、紐づけを行う項目を追加することができます。
{% endhint %}

## 設定方法

ソリューションエディタでエンドユーザー変数を追加し、型は「マッピング」を選択します。

<figure><img src="https://files.readme.io/fdecfaf-image.png" alt="" width="375"><figcaption></figcaption></figure>

作成したエンドユーザー変数をウィザードに割り当てます。

左カラム・右カラムそれぞれに、タイトルや入力方法などを設定できます。

<figure><img src="https://files.readme.io/4951ef3-image.png" alt="" width="563"><figcaption></figcaption></figure>

各カラムの入力方法は [基本的な入力ウィジェット](/wizard-editor/widget#nawijetto) から選択できます。

例として、左カラムにSalesforceの取引先フィールドをアシストするように設定する場合は、以下の通りになります。

<figure><img src="https://files.readme.io/41075b1-image.png" alt="" width="188"><figcaption></figcaption></figure>

## 使用例

### Salesforceの新規取引先をHubSpotの会社へ連携する

エンドユーザー変数で「マッピング」を作成します。

ウィザードの設定は以下の通りにします。

**左側：Salesforceの「オブジェクトのフィールド一覧」のアシスト**\
**右側：HubSpotの「企業情報読み込み可能フィールド一覧」のアシスト**

<figure><img src="https://files.readme.io/72a6242-image.png" alt="" width="375"><figcaption></figcaption></figure>

ソリューションのトリガーにSalesforceを設定します。

「レコードが作成/更新された際に実行」で、「取引先」オブジェクトを設定します。

<figure><img src="https://files.readme.io/550ea60-image.png" alt="" width="563"><figcaption></figcaption></figure>

「変数を作成」アクションで「取引先名」という変数を追加します。

変数の値は、[Formulaモード](/solution-editor/common-specs/formula)で`{レコード}.get("Name")`とします。

<figure><img src="https://files.readme.io/e64983b-image.png" alt="" width="563"><figcaption></figcaption></figure>

次にHubSpotのカスタムアクションを追加し、既に同一の会社名がないかを検索します。

<figure><img src="https://files.readme.io/a652a77-image.png" alt="" width="563"><figcaption></figcaption></figure>

<table><thead><tr><th width="286.68359375">項目名</th><th width="303.7734375">内容</th></tr></thead><tbody><tr><td>カスタムアクション名</td><td>会社情報を検索</td></tr><tr><td>HTTPメソッド</td><td>POST</td></tr><tr><td>リクエストパス</td><td>/crm/v3/objects/companies/search</td></tr><tr><td>リクエストURLパラメーター</td><td>設定不要</td></tr><tr><td>リクエストヘッダー</td><td>設定不要</td></tr><tr><td>リクエストタイプ</td><td>json</td></tr><tr><td>リクエストボディの入力方法</td><td>デフォルト</td></tr></tbody></table>

リクエストボディ定義：以下をJSONで追加します。

```json
{
    "limit": 20,
    "filterGroups":[
      {
        "filters":[
          {
            "propertyName": "",
            "operator": "",
            "value": ""
          }
        ]
      }
    ]
}
```

リストは「[固定リスト](/solution-editor/common-specs/fixed-list-dynamic-list)」にします。

<figure><img src="https://files.readme.io/5e0d583-image.png" alt="" width="375"><figcaption></figcaption></figure>

入力値は以下を設定します。

limit : 20\
propertyName :name\
operator : EQ\
value : {取引先名} ※Step2で作成した変数

<figure><img src="https://files.readme.io/5dd6261-image.png" alt="" width="375"><figcaption></figcaption></figure>

レスポンスボディ定義：以下をJSONで追加します。

```json
{
    "total": 0,
    "results": [
        {
            "id": "",
            "properties": {
                "name": ""
            }
        }
    ]
}
```

[ifステップ](/solution-editor/logic/if)を追加し、同一の会社名がない（検索結果が0件）の場合のみに実行する条件を作成します。

<figure><img src="https://files.readme.io/55c7da4-image.png" alt="" width="563"><figcaption></figcaption></figure>

HubSpotの企業情報を作成アクションを、ifがYesの場合に実行されるように設定します。

<figure><img src="https://files.readme.io/536d7c5-image.png" alt="" width="563"><figcaption></figcaption></figure>

リストソースに**マッピング型のエンドユーザー変数**を設定することで\
エンドユーザーが設定したマッピングの行数だけ、プロパティをセットすることができます。

<figure><img src="https://files.readme.io/17467ca-image.png" alt="エンドユーザーはマッピングを自由に追加できる" width="400"><figcaption><p>エンドユーザーはマッピング行数を自由に追加できる</p></figcaption></figure>

プロパティの設定では、`i番目のelement` から選択を行います。

<figure><img src="https://files.readme.io/e3e6ecc-image.png" alt="" width="563"><figcaption></figcaption></figure>

プロパティ名：`{ 左カラム }`

値：`{ Salesforce レコード }.get( { 左カラム } )`

を設定します。

これにより、

**マッピングの右側で設定した「HubSpotのプロパティ」に**

**マッピングの左側で設定した「Salesforceのプロパティ」が持つ値**

を書き込むことができます。

{% hint style="success" %}

### ヒント

HubSpotで会社レコードを作成する場合は `会社名（name）` が**必須**となります。\
このような場合、[デフォルト値を指定](/wizard-editor/advanced-setting/default-value)しておくことで、あらかじめ会社名がマッピングの行に含まれた状態で表示できます。
{% endhint %}


# コンディション

### 概要

コンディションは、エンドユーザーが条件のルールを指定できるウィジェットです。

<figure><img src="https://files.readme.io/677199e-image.png" alt="" width="563"><figcaption></figcaption></figure>

上記の例では、\
Salesforceで取得したリードの「リードソースの値」が`Web`であった場合は`True`を判定し\
Salesforceで取得したリードの「リードソースの値」が`Web以外`であった場合は`False`を判定します。

エンドユーザー変数の型&#x304C;**「コンディション」**&#x306E;場合に利用できます。

<figure><img src="https://files.readme.io/e533ba3-image.png" alt="" width="375"><figcaption></figcaption></figure>

## 使用方法

左辺・右辺のそれぞれについて、タイトルや入力方法などを設定します。

<figure><img src="https://files.readme.io/f4c3859-image.png" alt="" width="563"><figcaption></figcaption></figure>

{% hint style="success" %}

### ヒント

エンドユーザーのUXの観点から、\
左辺・右辺のどちらかは入力方法を「アシスト」「セレクト」等の**選択式の方法**にすることを推奨します。
{% endhint %}

コンディションの判定結果をソリューション内で使用するには、[Formula](/solution-editor/common-specs/formula)の「condition」もセットで利用してください。

<figure><img src="https://files.readme.io/062ac33-image.png" alt="" width="375"><figcaption></figcaption></figure>

condition関数の第一引数には、型が「コンディション」であるエンドユーザー変数を入力します。

condition関数の第二引数には、エンドユーザー変数の値を受け取って判定を行うためのlambda関数（無名関数）を入力します。

{% code overflow="wrap" %}

```python
condition( {エンドユーザー変数}, lambda関数 )
```

{% endcode %}

lambda関数は以下の形式で入力します。

{% code overflow="wrap" %}

```python
lambda left, right: # エンドユーザーの入力値をlambdaの引数に指定。leftは左辺の入力値, rightは右辺の入力値。
{
  'left': fx(left), # condition関数の左辺として評価したい値
  'right': fx(right) # condition関数の右辺として評価したい値
})
```

{% endcode %}

以下の例では、

右辺はエンドユーザーの入力値（`Web`）のまま評価します。\
左辺は、「Salesforceのレコード（`リード`）」から「エンドユーザーの左辺の入力値（`リードソース`）」をキーにして値（`Web`, `Phone Inquery`, `Partner Refferal` etc...) を取得し、それを評価します。

<figure><img src="https://files.readme.io/677199e-image.png" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="https://files.readme.io/062ac33-image.png" alt="" width="375"><figcaption></figcaption></figure>

エンドユーザーは条件として、左辺と右辺が「等しい」を指定しているため、\
Salesforceで取得したリードの「リードソースの値」が`Web`であった場合は`True`になり、\
Salesforceで取得したリードの「リードソースの値」が`Web以外`であった場合は`False`になります。

## 使用例

### Salesforce → HubSpot にリード情報が連携される条件を設定する

Salesforceの「レコードが作成された際に実行」トリガーを設定します。オブジェクトは「リード」にします。

続けてHubSpotの「人物情報を作成」アクションも設定します。

<figure><img src="https://files.readme.io/72919a0-image.png" alt="" width="563"><figcaption></figcaption></figure>

コンディションのエンドユーザー変数を作成し、ウィザードに割り当てます。

左辺はSalesforceの「オブジェクトのフィールド一覧」アシストとし、参照フィールドのデフォルト値は「Lead」にしておきます。

右辺はテキスト入力のままにしておきます。

<figure><img src="https://files.readme.io/9658b37-image.png" alt="" width="563"><figcaption></figcaption></figure>

これにより、左辺にはエンドユーザーが「リードオブジェクトの任意のフィールド」を指定できるようになり、

右辺でその「フィールドの値」を指示できるようになりました。

<figure><img src="https://files.readme.io/0f2832b-image.png" alt="" width="563"><figcaption></figcaption></figure>

これらの条件が満たされた場合のみトリガーを実行させるために、Salesforceのトリガー条件を設定します。

トリガー条件のifのデータにcondition関数を入力し、状態：等しい、値：True で設定します。

<figure><img src="https://files.readme.io/de9d34f-image.png" alt="" width="563"><figcaption></figcaption></figure>

これにより、Salesforceのレコードが作成された際に、エンドユーザーが指定した条件が満たされた場合のみ、HubSpotにデータを連携することができます。

### HubSpot → Salesforce にコンタクト情報が連携される条件を設定する

HubSpotの「コンタクトが作成・更新された際に実行」トリガーを設定します。（詳細な設定は後で行います）

続けてSalesforceの「レコードを作成」アクションを設定します。オブジェクトは「Lead」にします。

<figure><img src="https://files.readme.io/810d8de-image.png" alt="" width="563"><figcaption></figcaption></figure>

コンディションのエンドユーザー変数を作成し、ウィザードに割り当てます。

左辺はHubSpotの「人物情報読み込み可能フィールド一覧」アシストとします。

右辺はテキスト入力のままにしておきます。

<figure><img src="https://files.readme.io/0b4613c-image.png" alt="" width="563"><figcaption></figcaption></figure>

これにより、左辺にはエンドユーザーが「コンタクトオブジェクトの任意のフィールド」を指定できるようになり、

右辺でその「フィールドの値」を指示できるようになりました。

<figure><img src="https://files.readme.io/c625b4a-image.png" alt="" width="563"><figcaption></figcaption></figure>

ソリューションエディタに戻り、HubSpotのトリガー設定を詳細に行います。

HubSpot の[API仕様](https://developers.hubspot.jp/docs/api/crm/contacts)として、対象のレコードが持つ全てのプロパティを取得できるわけではなく、指定したプロパティのみを取得できる仕様になっています。\
（Record ID, Create Date, Last Modified Date はデフォルトで取得されますが、それ以外のプロパティは指定しない限り取得できません）

そのため、エンドユーザーが指定したプロパティを取得できるように、リストソースや要素フィールドを設定します。

<figure><img src="https://files.readme.io/be6ecca-image.png" alt="" width="563"><figcaption></figcaption></figure>

そのうえで、エンドユーザーが指定した条件が満たされた場合のみトリガーを実行させるために、HubSpotのトリガー条件を設定します。

トリガー条件のifのデータにcondition関数を入力し、状態：等しい、値：True で設定します。

<figure><img src="https://files.readme.io/29d0a0f-image.png" alt="" width="563"><figcaption></figcaption></figure>

これにより、HubSpotのレコードが作成された際に、エンドユーザーが指定した条件が満たされた場合のみ、Salesforceにデータを連携することができます。


# CSV（ファイル全体）

## 概要

CSVウィジェットではエンドユーザーからCSVファイルのアップロードを受け付け、中身を文字列としてソリューション内で利用することができます。

このウィジェットを使う場合はエンドユーザー変数の型&#x304C;**「String」**&#x3067;あることを推奨します。

<figure><img src="https://files.readme.io/73e77cb557b213a6868c185a616b1b90a4a9d379bbd388ea74e00fb31cc6e4e7-image.png" alt="" width="563"><figcaption></figcaption></figure>

{% hint style="success" %}

### ヒント

このウィジェットはCSVの中身全体を読み込みます。\
CSVのヘッダーのみを読み込む場合は[CSV項目ウィジェット](https://1345286555-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F2SAP0zfldVFDluPfMXkq%2Fuploads%2FKqR8S7RCBDPFuUl7phxg%2Fcsv%20header?alt=media)をご利用ください。
{% endhint %}

## 使い方

String型のエンドユーザー変数を作成し、フィールドの入力方法を「CSV」にします。

<figure><img src="https://files.readme.io/fc766daa79405f2140a2776b547cf904563be3d2ad8d254b5ded0a44094d2d5d-image.png" alt="" width="563"><figcaption></figcaption></figure>

ソリューションの処理に[CSVアクション](/solution-editor/actions/data-transform/csv)を追加します。\
CSVコンテンツにはエンドユーザー変数を設定し、区切り文字やヘッダーの内容を適切に入力します。

<figure><img src="https://files.readme.io/6681f8215dd48e50faa4568d05568075a8d1d062ec13355d48595e8c80f8f937-image.png" alt="" width="563"><figcaption></figcaption></figure>

ウィザードでは、エンドユーザーにはCSVをアップロードするウィジェットが表示されます。

<figure><img src="https://files.readme.io/5f5c08e01bd53542e37099ec5e2465b3b238113ce5a4339052522436cec4c1e6-image.png" alt="" width="563"><figcaption></figcaption></figure>

CSVをアップロードすると、中身がプレビューされます。

<figure><img src="https://files.readme.io/2180743e8005de5ddf83179e4ec0b4a01bdeaa99ef733d01b1fa75d2bbe1658e-image.png" alt="" width="563"><figcaption></figcaption></figure>

* 左上の件数はCSVの行数です
* 右上の「CSVファイルをインポート」から別のCSVに置き換えできます
* 右上の「すべてクリア」を押すとCSVをアップロードする前の状態に戻ります

エンドユーザーがソリューションをインストールしソリューションが実行されると、CSVの各行が配列として処理されていることが分かります。

## 注意点

<figure><img src="https://files.readme.io/6c6815f87a0f4a52bfabee171cdc47fa36551ff451c5a2095f40529e91067092-image.png" alt="" width="563"><figcaption></figcaption></figure>

CSVウィジェットで扱えるファイルサイズは10MBまでに制限されています。

10MBを超える場合はウィジェットを複数配置し分割してアップロードするか、別の方法をご利用ください。


# CSV項目（ヘッダーのみ）

CSV項目のウィジェットには、CSV項目定義 と CSV項目選択 が存在します。

これらは基本的にセットで利用します。

## CSV項目定義

CSV項目選択ウィジェットは、エンドユーザーがCSVの項目（ヘッダー）を定義するためのウィジェットです。\
本ウィジェットは、エンドユーザー変数の型がStringの際に利用できます。

{% hint style="success" %}

### ヒント

本ウィジェットは、CSVのヘッダーのみが読み込まれます。\
CSVの中身を読み込む場合は [CSVウィジェット](/wizard-editor/widget/csv) をご利用ください。
{% endhint %}

<figure><img src="https://files.readme.io/ee85e3c-Screen_Shot_2023-03-22_at_6.08.24_PM.png" alt="" width="563"><figcaption></figcaption></figure>

エンドユーザーがCSVを選択すると、以下のようなUIに変化します。

<figure><img src="https://files.readme.io/866e6cf-Screen_Shot_2023-03-22_at_6.17.13_PM.png" alt="602" width="375"><figcaption><p>CSVを選択し、ヘッダーを読み込ませた例</p></figcaption></figure>

ソリューション内ではエンドユーザー変数にCSVのヘッダーがテキストで展開されます。

<figure><img src="https://files.readme.io/0326b59-Screen_Shot_2023-03-22_at_6.19.21_PM.png" alt="442" width="375"><figcaption><p>ソリューションエディターの変数ウィンドウ</p></figcaption></figure>

## CSV項目選択

CSV項目選択ウィジェットは、エンドユーザーがCSV項目定義した項目を選択することが可能なウィジェットです。

CSV項目選択ウィジェットは、CSV項目定義ウィジェットとセットで利用します。\
スクリーンに配置済みのCSV項目定義を設定することで、エンドユーザーが項目を選択することが可能です。

<figure><img src="https://files.readme.io/3e64794-Screen_Shot_2023-03-22_at_6.11.55_PM.png" alt="" width="563"><figcaption></figcaption></figure>

実際のエンドユーザーの利用画面は以下の通りです。\
エンドユーザーが定義したCSVの項目の一覧を選択できることが確認できます。

<figure><img src="https://files.readme.io/2781f7f-Screen_Shot_2023-03-22_at_6.21.44_PM.png" alt="563" width="375"><figcaption><p>定義したヘッダーを選択する様子</p></figcaption></figure>

エンドユーザーがCSVの項目を選択すると、ソリューション内では選択した項目のインデックス番号が展開されます。\
CSVの項目で `請求No,請求終了日,請求書宛コード...` が展開されており、エンドユーザーがCSV項目選択ウィジェットで `請求No` を選択したため、`0` が展開されています。

<figure><img src="https://files.readme.io/71eaddd-Screen_Shot_2023-03-22_at_6.23.10_PM.png" alt="" width="375"><figcaption></figcaption></figure>


# ウィザードの仕様

## ウィザードの構成要素

* 画面のタイトルや説明文
* エンドユーザーが持つSaaSアカウントを認証するコネクション設定ボタン
* エンドユーザーの入力を受け付けるウィジェット
* 次へ/完了/キャンセル ボタン

上記の内容をAnyflowのドメイン(wizard.anyflow\.jp)で表示しています。[Anyflow SDK](/anyflow-sdk/docs)を使うことでiframeを生成しこれを埋め込むことが可能です。

## 処理の流れ

### 初期設定

1. エンドユーザーはウィザードを表示する
2. コネクション設定ボタンからSaaSアカウントを認証する
3. ウィジェットに値を入力する
4. 完了ボタンを押す
5. Anyflowサーバー上で、[ソリューションインスタンス](/introduction/glossary#soryshoninsutansu)が発行される

{% hint style="success" %}
原則として、初期設定の処理は1ソリューション1エンドユーザーにつき1度実施すれば十分です。

インスタンス内容を更新したい場合は、同様の手順で更新できます。

その際、前回のインスタンス内容は保存されているため必要な箇所のみを変更することが可能です。
{% endhint %}

### ソリューション実行

1. ソリューションはトリガーが発火するのを待機する
2. [トリガー](/solution-editor/triggers)が条件を満たし発火する
3. ソリューションインスタンスに基づき、ソリューションが実行される
4. [実行履歴](/ops/solution-history)が作成される
5. エンドユーザーはウィザードで実行履歴を確認できる

{% hint style="success" %}
ソリューションの実行は、トリガーが発火するたびに行われます。

1つのソリューションインスタンスに対し、何度でもソリューション実行が可能です。
{% endhint %}




---

[Next Page](/llms-full.txt/1)

