データストアを利用する
この記事では、データストアの具体的な利用例を紹介します。
・1つのプロジェクト内に存在する複数のワークフローで、共通の変数を利用したい時
・繰り返しのエラーを途中から再開したい時
データストアの活用例
本記事では、以下のデータストア活用例を順に紹介します。
データストアの基本については、こちらの記事をご参照ください。
- 複数のワークフローで共通の値を利用する
- エラー時に実行するワークフロー内部での活用
(エラー回数をデータストア変数でカウントし、エラー回数に応じた条件分岐を行う) - 繰り返しとエラー捕捉を併せた活用
(繰り返しでURLにアクセスする際に、エラーしたURLのみデータストアに保存する) - 繰り返しの分割実行
(繰り返し10回ごとにワークフローを再起動し、前回の途中から実行する)
1.複数のワークフローで共通の値を利用する
複数のワークフローで同一のメール文やテンプレート文を利用したい場合、データストアを使用すると便利です。
この章では、複数のワークフローで名前以外を定型文としたメールを送信する例を紹介します。
- データストア管理画面から、+追加ボタンをクリックします。
- 変数名をmailBodyTemplateとします。
- 値を以下とします。
||%%NAME%%||さん 暑中見舞い申し上げます。 以上です。
- 1のメール文を送信する各ワークフローに、DataStoreGetを設定します。
- 変数名にmailBodyTemplateと入力します。
例として、メール文の宛先名の部分のみ、任意の値に置換してみます。
- ReplaceTextを設定します。
- 検索対象テキストに、DataStoreGetのアウトプットを指定します。
- 検索クエリに、||%%NAME%%||と入力します。
- 正規表現をOFFにします。
- 置き換えるテキストに、任意の適当な名前を入力します。
- GmailSendを設定します。
- 本文にReplaceTextのアウトプットを設定します。
共通のメール文(データストア変数)を利用して、メールの送信に成功していることが確認できます。
# データを取得する +data_store_get_1: action>: DataStoreGet key: mailBodyTemplate # 検索して置換 +replace_text_1: action>: ReplaceText text: +data_store_get_1 find: '||%%NAME%%||' use_regex: false replace_with: 'デル・トロ' # Gmailを送信する +gmail_send_1: action>: GmailSend provider: '' to: '' subject: '暑中見舞い' body: +replace_text_1 attachments: '' from: '' meta: display:
2.エラー時に実行するワークフロー内部で利用
AUTOROでは、ワークフローがエラーした際に、自動で特定のワークフローを実行させることが可能です。
参考:エラー時に実行するワークフロー
しかし、この設定だけでは、エラーの発生回数に応じた処理を行なうことはできません。
この章では、データストアを活用してエラーの発生回数を保持し、その回数に応じた分岐処理を設定する例を紹介します。
- データストア管理画面から、+追加ボタンをクリックします。
- 変数名をtodayErrorCountとします。
- 値を半角数字の0とします。
- 追加をクリックします。
- エラー時に実行するワークフローに設定されているワークフローを開きます。
- 一番上にDataStoreGetを設定します。
- DataStoreGetの変数名にtodayErrorCountと入力します。
- StoreValueを追加します。
- StoreValueの変数名にerrCntと入力します。
- StoreValueの値に、DataStoreGetのアウトプットを指定します。
現在編集しているワークフローは、エラー時に実行されるワークフローとなります。
このワークフローの中では、データストアのエラー回数格納変数であるtodayErrorCountに1を加算する必要があります。
- DataStoreSaveを追加します。
- 値を以下とします。
${parseInt(errCnt) + 1}
エラー回数が3回以上になった場合に真となる条件分岐を設定します。
- ifを設定します。
- 条件式を以下とします。
${parseInt(errCnt) + 1 >= 3}
- ifの中に、エラー回数が3回以上になった場合に実行したい処理を設定していきます。
エラーを格納する変数の値は、どこかのタイミングで0にしない限り、エラーする度に加算され続けてしまいます。
これを回避するためには、1日に1回等の任意のタイミングで、エラーを格納する変数の値を0とする必要があります。実現方法は以下となります。
- 新たにワークフローを作成します。
- DataStoreSaveを設定します。
- 変数名をtodayErrorCountとします。
- 値を半角数字の0とします。
- ワークフローを保存します。
- スケジュール画面から、このワークフローが1日1回実行されるように設定します。
参考リンク:スケジュール
# データを取得する +data_store_get_1: action>: DataStoreGet key: todayErrorCount # 変数に保存 +store_value_1: action>: StoreValue key: errCnt value: +data_store_get_1 # データを保存する +data_store_save_1: action>: DataStoreSave key: todayErrorCount value: ${parseInt(errCnt) + 1} # 真のとき_エラー回数が3回を超えた場合 +if_1: if>: ${parseInt(errCnt) + 1 >= 3} _do: # テキストを作成 +text_1: action>: Text text: 'エラー回数が3回を超えました'
3.繰り返しとエラー捕捉を併せた活用
繰り返しの範囲内にTry(エラーを捕捉する)が設定されている場合、その繰り返しでエラーが発生してもワークフローは終了されず、次の繰り返しに移ることができます。
参考:エラーを捕捉(Try)
このTryを利用すれば、繰り返しの範囲内でエラーが発生した場合に、エラーした繰り返し要素とエラー内容をデータストアに蓄積することが可能です。
蓄積された値は、後から確認したり、スプレッドシート/Excelに貼り付けたり、蓄積された値のみを別のワークフローで改めて繰り返すこともできます。
ここでは、繰り返しの中で捕捉されたエラーのエラーメッセージと、繰り返し中の値を、二次元配列形式でデータストアに格納する方法を紹介します。
- データストア管理画面から、+追加ボタンをクリックします。
- 変数名をerrorRowsとします。
- 値を
[]
とします。これは空の配列と判定されます。
- 以下のワークフローをエディタモードからコピペします。 コピペ方法はこちらをご参照ください。
# スクリプトを実行 +run_script_1: action>: RunScript code: "return [\n [\n \"kintone\",\n \"https://docs.autoro.io/actions/kintone\",\n \"div[data-testid='page.title']\"\n ],\n [\"OneLogin\", \"https://docs.autoro.io/sso/onelogin\", \"hoge\"],\n [\"GitHub\", \"https://docs.autoro.io/integrations/github\", \"fuga\"],\n [\n \"S3\",\n \"https://docs.autoro.io/connections/s3\",\n \"div[data-testid='page.title']\"\n ],\n [\"Azure AD\", \"https://docs.autoro.io/sso/azure_ad\", \"hf\"]\n];\n" # 各要素について繰り返す +for_each_1: for_each>: row: +run_script_1 _do: # エラーを捕捉する +try_1: try>: isError _do: # ブラウザを開く +open_browser_1: action>: OpenBrowser url: ${row[1]} lang: 'ja-JP' timeZone: 'Asia/Tokyo' headless: true windowSize: '1280 x 720' useShadowDomSelector: false # テキストを取得 +get_text_1: action>: GetText browser: +open_browser_1 selector: ${row[2]} ignoreError: false # ブラウザを閉じる +close_browser_1: action>: CloseBrowser browser: +open_browser_1 # テキストを作成 +text_1: action>: Text text: 'Try範囲内には、UpdateCells(セルの値を更新)などが設置される事が多いです。'
2ではTryの対象範囲のみを設定しました。ここからはTryでエラーした時のための設定を追加していきます。
- ifを画像の位置に追加します。(Tryの範囲外, ForEachの範囲内)
- 条件式に以下を入力します。(これはエラーした時のみtrueになる条件式です。)
${isError}
- ifの範囲内にDataStoreGetを設定します。
- DataStoreGetの変数名に
errorRows
と入力します。
データストア変数errorRowsをワークフローで利用できるようにするため、データストア変数errorRowsの値をワークフロー内変数erRowsに保存します。
- ifの範囲内にStoreValueを設定します。
- StoreValueの変数名に
erRows
と入力します。 - StoreValueの値にDataStoreGetのアウトプットを指定します。
データストア変数errorRowsに追加する値(1行)を生成します。
- StoreValueを設定します。
- 変数名をerrorRowとします。
- 値に以下を入力します。これは1次元配列で、値の内訳はForEachのelementであるrowに、エラーメッセージを追加したものとなります。
${row.concat([isError.message])}
- DataStoreSaveを設定します。
- DataStoreSaveの変数名にerrorRowsと入力します。
- DataStoreSaveの値に以下を指定します。これによりデータストアのerrorRowsにエラーした行が追加されます
${erRows.push(errorRow);erRows}
エラーした行とエラーメッセージが確認できます。
なお、データストア変数errorRowsは二次元配列であるため、スプレッドシートやExcelに書き込む値として利用することも可能です。
# スクリプトを実行 +run_script_1: action>: RunScript code: "return [\n [\n \"kintone\",\n \"https://docs.autoro.io/actions/kintone\",\n \"div[data-testid='page.title']\"\n ],\n [\"OneLogin\", \"https://docs.autoro.io/sso/onelogin\", \"hoge\"],\n [\"GitHub\", \"https://docs.autoro.io/integrations/github\", \"fuga\"],\n [\n \"S3\",\n \"https://docs.autoro.io/connections/s3\",\n \"div[data-testid='page.title']\"\n ],\n [\"Azure AD\", \"https://docs.autoro.io/sso/azure_ad\", \"hf\"]\n];\n" # 各要素について繰り返す +for_each_1: for_each>: row: +run_script_1 _do: # エラーを捕捉する +try_1: try>: isError _do: # ブラウザを開く +open_browser_1: action>: OpenBrowser url: ${row[1]} lang: 'ja-JP' timeZone: 'Asia/Tokyo' headless: true windowSize: '1280 x 720' useShadowDomSelector: false # テキストを取得 +get_text_1: action>: GetText browser: +open_browser_1 selector: ${row[2]} ignoreError: false # テキストを作成 +text_1: action>: Text text: 'Try範囲内には、UpdateCells(セルの値を更新)などが設置される事が多いです。' # 真のとき_Try内部でエラー回数が発生した場合 +if_1: if>: ${isError} _do: # データを取得する +data_store_get_1: action>: DataStoreGet key: errorRows # 変数に保存 +store_value_1: action>: StoreValue key: erRows value: +data_store_get_1 # 変数に保存_データストアに入れる1行 +store_value_2: action>: StoreValue key: errorRow value: ${row.concat([isError.message])} # データを保存する +data_store_save_1: action>: DataStoreSave key: errorRows value: ${erRows.push(errorRow);erRows}
4.繰り返しの分割実行
AUTOROで繰り返しを実行する場合、以下のような理由によりワークフローが強制終了される場合があります。
・ワークフロー1回あたりの実行時間上限に到達
・ロボットのCPU/メモリの負荷が大きくなりすぎた
※実行時間上限…シングルモード10時間, ロボットレス1時間(参考リンク)
これを回避するためには、繰り返しx回ごとにワークフローそのものを再起動し、繰り返しを途中から再開する方法が最も有効となります。この章ではこの方法を紹介します。
※データストアを使用せずに、スプレッドシートを使用して同様の事を実現することも可能です。スプレッドシートを用いた方法はこちらをご参照ください。
参考:スプレッドシートを繰り返しで1行ずつ処理する
- データストア管理画面から、+追加ボタンをクリックします。
- 変数名をtargetURLsとします。
- 値を
[]
とします。これは空の配列と判定されます。
- 以下のワークフローをエディタモードからコピペします。 コピペ方法はこちらをご参照ください。
# データを取得する_forEachする要素を格納した配列 +data_store_get_1: action>: DataStoreGet key: targetURLs # 変数に保存 +store_value_1: action>: StoreValue key: urls value: +data_store_get_1 # 真のとき_アクセス対象のURLが存在しない +if_1: if>: ${urls.length === 0} _do: # ブラウザを開く +open_browser_1: action>: OpenBrowser url: 'https://www.bunka.go.jp/kindai/research/index.html' lang: 'ja-JP' timeZone: 'Asia/Tokyo' headless: true windowSize: '1920 x 1080' useShadowDomSelector: false # 待機する +wait_1: action>: Wait time: 5000 # スクレイピング_リンク +scrape_page_1: action>: ScrapePage browser: +open_browser_1 selector: '#pref_kanagawa a.research-card__link' text_only: false ignoreError: true # ブラウザを閉じる +close_browser_1: action>: CloseBrowser browser: +open_browser_1 # JSONを配列に変換_リンクのURLのみ抽出 +convert_j_s_o_n_to_array_1: action>: ConvertJSONToArray json: +scrape_page_1 header: ["href"] unwind: [] stringify: [] # テーブルデータ(二次元配列)を変換_ヘッダーを除去 +convert_table_1: action>: ConvertTable header: false table: +convert_j_s_o_n_to_array_1 transform: [{"type":"filter","column":"0","operator":"!=","operand":"href","include_blank":false},{"type":"column","columns":{"0":"0"}}] # データを保存する_アクセス対象のURL +data_store_save_1: action>: DataStoreSave key: targetURLs value: +convert_table_1 # 変数に保存_ワークフローで使用するため +store_value_2: action>: StoreValue key: urls value: +convert_table_1 # 各要素について繰り返す_アクセス対象のURL +for_each_1: for_each>: url: ${urls} withIndex: accessCount _do: # ブラウザを開く_対象URL +open_browser_2: action>: OpenBrowser url: ${url} lang: 'ja-JP' timeZone: 'Asia/Tokyo' headless: true windowSize: '1280 x 720' useShadowDomSelector: false # 待機する +wait_2: action>: Wait time: 3300 # 要素のスクリーンショットを撮る +take_element_shot_1: action>: TakeElementShot browser: +open_browser_2 selector: 'body > div.p-contents.research-body.research-body--detail' type: png ignoreError: false # ブラウザを閉じる +close_browser_2: action>: CloseBrowser browser: +open_browser_2 # データを保存する_データストアのアクセス対象URL配列から現在アクセスしたURLのみ消す +data_store_save_3: action>: DataStoreSave key: targetURLs value: ${urls.shift();urls} # 真のとき_繰り返し10回目 +if_3: if>: ${accessCount === 9} _do: # 待機する +wait_3: action>: Wait time: 60000 # ワークフローを実行する +add_to_queue_1: action>: AddToQueue workflow_id: # 繰り返しを終了する +break_if_1: break_if>: ${accessCount === 9}
このワークフローでは、以下を実行しています。
- データストアから、AUTOROからアクセスするURLの一覧(配列)であるtargetURLsを取得する。
- targetURLsが存在しなければ、targetURLsを作成し、データストアに保存する。(if_1による)
- targetURLsをforEachで繰り返す。
- 繰り返し1回毎に、現在アクセスしたURLのみをtargetURLsから除去し、データストアのtargetURLsを更新する。
これにより、次回以降はtargetURLsのうちアクセスしていないURLの行のみがForEachされる。 - forEachの繰り返し回数が10回に到達したら、以下を行なう
・if_2範囲内のAddToQueueにより、ワークフローを再実行する
・if_2範囲内のbreak_if_1により、forEachの範囲を抜ける。
・forEachの下にはアクションが存在しないため、ワークフローが終了する。