Docly Child

データストアを利用する

219 views

この記事では、データストアの具体的な利用例を紹介します。


データストアを利用する場面

・1つのプロジェクト内に存在する複数のワークフローで、共通の変数を利用したい時
・繰り返しのエラーを途中から再開したい時

 データストアの活用例

本記事では、以下のデータストア活用例を順に紹介します。
データストアの基本については、こちらの記事をご参照ください。

  1. 複数のワークフローで共通の値を利用する
  2. エラー時に実行するワークフロー内部での活用
    (エラー回数をデータストア変数でカウントし、エラー回数に応じた条件分岐を行なう)
  3. 繰り返しとエラー捕捉を併せた活用
    (繰り返しでURLにアクセルする際に、エラーしたURLのみデータストアに保存する)
  4. 繰り返しの分割実行
    (繰り返し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: 40589

        # 繰り返しを終了する
        +break_if_1:
          break_if>: ${accessCount === 9}

このワークフローでは、以下を実行しています。

  1. データストアから、AUTOROからアクセスするURLの一覧(配列)であるtargetRowsを取得する。
  2. targetRowsが存在しなければ、targetRowsを作成し、データストアに保存する。(if_1による)
  3. targetRowsをforEachで繰り返す。
  4. 繰り返し1回毎に、現在アクセスしたURLのみをtargetRowsから除去し、データストアのtargetRowsを更新する。
    これにより、次回以降はtargetRowsのうちアクセスしていないURLの行のみがForEachされる。
  5. forEachの繰り返し回数が10回に到達したら、以下を行なう
    ・if_2範囲内のAddToQueueにより、ワークフローを再実行する
    ・if_2範囲内のbreak_if_1により、forEachの範囲を抜ける。
    ・forEachの下にはアクションが存在しないため、ワークフローが終了する。

<データストア>DataStore

このページは役に立ちましたか?