データストアを利用する
この記事では、データストアの具体的な利用例を紹介します。
・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の下にはアクションが存在しないため、ワークフローが終了する。
