top of page
Akira Mizuno

(8) 投稿データの前処理

1.はじめに

 

今回の記事では、ポストの編集が行われた時に最新のツイートのみを取り出す処理を行います。

それらのツイートをまとめて配列変数に格納して、次回のTeamsに投稿するフローで使用します。


2.最近のツイート一覧データ

 

Teams投稿用のツイートデータ一式を格納するための配列変数を追加します。


2.1.アクションの追加

「X API情報」アクションの下の+をクリックして、「アクションの追加」を選択します。


2.2.アクションの選択

「変数(Variable)」の中から「変数を初期化する」を選択します。


2.3.アクション設定

(1)アクションの名前を「最近のツイート一覧データ」に変更します。

(2)「▼パラメーター」の表に従って、「パラメーター」タブから以下の赤枠のように設定します。


▼パラメーター

名前

設定する値

Name

varRecentTweetData

Type

Array

Value

[]



3.最近のツイート一覧データあり?

 

X APIを実行した結果、最近のツイート一覧のデータが存在したかどうかを判定します。


3.1.アクションの追加

「最近のツイート一覧を取得」アクションの下の+をクリックして、「アクションの追加」を選択します。


3.2.アクションの選択

「Control」の中から「条件」を選択します。


3.3.アクション設定

(1)アクションの名前を「最近のツイート一覧データあり?」に変更します。

(2)「▼パラメーター」の表に従って、「パラメーター」タブから以下の赤枠のように設定します。


▼パラメーター

Condition Expression

AND





@empty(body('最近のツイート一覧を取得')?['data'])

is equal to

@false



4.最近のツイートデータを初期化

 

Teams投稿用のツイートデータを格納するための変数を初期化します。


4.1.アクションの追加

「最近のツイート一覧データあり?」アクション内の「True」内の+をクリックして、「アクションの追加」を選択します。

4.2.アクションの選択

「Variable」の中から「変数の設定」を選択します。


4.3.アクション設定

(1)アクションの名前を「最近のツイートデータを初期化」に変更します。

(2)「▼パラメーター」の表に従って、「パラメーター」タブから以下の赤枠のように設定します。


▼パラメーター

名前

設定する値

Name

varRecentTweetData

Value

[]


5.編集済みのツイートを除外する処理

 

Xユーザーが投稿済みのツイートを編集した場合、X APIで取得したデータには編集前のツイートも含まれます。Teamsへは最新のツイートのみを投稿したいため、修正前のツイートを除外してTeams投稿用の変数に格納します。

X APIで取得したデータは新しい→古い順になっているため、ここでreverse関数により古い→新しい順に並び替えておきます。


5.1.アクションの追加

「最近のツイートデータを初期化」の下の+をクリックして、「アクションの追加」を選択します。

5.2.アクションの選択

「Control」の中から「それぞれに適用する」を選択します。


5.3.アクション設定

(1)アクションの名前を「編集済みのツイートを除外する処理」に変更します。

(2)「▼パラメーター」の表に従って、「パラメーター」タブから以下の赤枠のように設定します。

▼パラメーター

名前

設定する値

Select An Output From Previous Steps

@reverse(body('最近のツイート一覧を取得')?['data'])


(3)「▼設定」の表に従って、「設定」タブから以下を赤枠のように「並列処理の次数」を「1」に設定します。

(「コンカレンシーの制御」及び「並列処理の次数」は、それぞれ「Concurrency control」及び「Degree of parallelism」の表記になっているかもれません。)


▼設定

名前

設定する値

コンカレンシーの制御

オン

並列処理の次数

1



6.ツイートIDが編集履歴の最新?

 

編集履歴のデータと比較して、ツイートデータが最新のものかどうかの判定を行います。


6.1.アクションの追加

「編集済みのツイートを除外する処理」の中の+をクリックして、「アクションの追加」を選択します。


6.2.アクションの選択

「Control」の中から「条件」を選択します。


6.3.アクション設定

(1)アクションの名前を「ツイートIDが編集履歴の最新?」に変更します。

(2)「▼パラメーター」の表に従って、「パラメーター」タブから以下の赤枠のように設定します。


▼パラメーター

Condition Expression

AND





@item()?['id']

is equal to

@last(item()?['edit_history_tweet_ids'])



7.最近のツイートデータを変数に追加

 

ツイートデータが最新であれば、Teams投稿用の変数に追加します。


7.1.アクションの追加

「ツイートIDが編集履歴の最新?」アクション内の「True」内の+をクリックして、「アクションの追加」を選択します。


7.2.アクションの選択

「Variable」の中から「配列変数に追加」を選択します。


7.3.アクション設定

(1)アクションの名前を「最近のツイートデータを変数に追加」に変更します。

(2)「▼パラメーター」の表に従って、「パラメーター」タブから以下の赤枠のように設定します。


▼パラメーター

名前

設定する値

Name

varRecentTweetData

Value

@items('編集済みのツイートを除外する処理')



8.最近のツイートデータを空に設定

 

最近のツイート一覧データが存在しなかった場合には、Teams投稿用の変数を空(データが0件)とします。


8.1.アクションの追加

「最近のツイート一覧データあり?」アクション内の「False」内の+をクリックして、「アクションの追加」を選択します。


8.2.アクションの選択

「Variable」の中から「変数の設定」を選択します。


8.3.アクション設定

(1)アクションの名前を「最近のツイートデータを空に設定」に変更します。

(2)「▼パラメーター」の表に従って、「パラメーター」タブから以下の赤枠のように設定します。


▼パラメーター

名前

設定する値

Name

varRecentTweetData

Value

[]


9.補足

 

▼ツイートの編集

Xの有料プランではポストを編集できる機能があります。編集した場合には、次のように過去のツイートも含まれて取得されます。例えば、idが"aaaaaaaaaaaaaaaaaaaa"の方が編集前のツイートで"bbbbbbbbbbbbbbbbbbbb"が編集後のツイートになります。

{
  "data": [
    {
      "author_id": "xxxxxxxxxxx",
途中省略
      "edit_history_tweet_ids": [
        "aaaaaaaaaaaaaaaaaaaa",
        "bbbbbbbbbbbbbbbbbbbb",
      ],
      "created_at": "2024-09-30T23:53:31.000Z",
      "text": "テキストのメッセージ本文(編集前)",
      "id": "aaaaaaaaaaaaaaaaaaaa"
    },
    {
      "author_id": "xxxxxxxxxxx",
途中省略
      "edit_history_tweet_ids": [
        "aaaaaaaaaaaaaaaaaaaa",
        "bbbbbbbbbbbbbbbbbbbb",
      ],
      "created_at": "2024-09-30T23:53:31.000Z",
      "text": "テキストのメッセージ本文(編集後)",
      "id": "bbbbbbbbbbbbbbbbbbbb"
    },

ポストを編集するとツイートIDが変わり、その履歴は「edit_history_tweet_ids」に格納されています。

そこで「6.ツイートIDが編集履歴の最新?」では、以下のように「edit_history_tweet_ids」配列の最後(last関数)のみを取り出しています。

@last(item()?['edit_history_tweet_ids'])

もう少し詳しく説明すると、「5.編集済みのツイートを除外する処理」の「それぞれに適用する」アクションのループ内なので、「item()」を使用して「body('最近のツイート一覧を取得')['data']」の配列の値を順に取り出しています。

「item()?['edit_history_tweet_ids']」とすると次のような配列になるので、last()関数で最後のidを取り出します。

(この場合は、"bbbbbbbbbbbbbbbbbbbb"のみを取り出します。)

      [
        "aaaaaaaaaaaaaaaaaaaa",
        "bbbbbbbbbbbbbbbbbbbb",
      ],

その他、ポストの編集が行われていなくても「edit_history_tweet_ids」にidが一つ含まれるため、上記の処理と共通化できます。



▼nullと空(数値の0や配列の場合は0件)

PowerAutomateでは、プログラミング言語やデータベースと同様に何もデータを持たないことを表すnullという概念があります。

空の値と混乱しますが、容器があるものの何も入っていない場合には空、容器そのものが用意されていない場合にはnullを意味します。


配列の変数の初期化でこの違いを見てみると、次のようにValueに0件の配列([])を設定したものが空です。

一方で、次のようにValueに何も設定していない場合にはnullです。


「最近のツイート一覧を取得」アクションで取得したデータは、次のようにdataが配列で帰ってきます。「body('最近のツイート一覧を取得')['data'][0]」の値が青文字の部分、「body('最近のツイート一覧を取得')['data'][1]」の値が赤文字の部分となります。

{
  "data": [
    {
      "author_id": "xxxxxxxxxxxxx",
      "attachments": {
        "media_keys": [
          "3_xxxxxxxxxxxxxxxxx"
        ]
      },
途中省略
      "edit_history_tweet_ids": [
        "xxxxxxxxxxxxxxxxxx"
      ],
      "created_at": "2024-10-01T01:42:31.000Z",
      "text": "ツイート本文の文章1",
      "id": "xxxxxxxxxxxxxxxxxx"
    },
    {
      "author_id": "xxxxxxxxxxxxx",
      "referenced_tweets": [
        {
          "type": "quoted",
          "id": "xxxxxxxxxxxxxxxxxx"
        }
      ],
途中省略
      "edit_history_tweet_ids": [
        "xxxxxxxxxxxxxxxxxx"
      ],
      "created_at": "2024-09-30T23:53:31.000Z",
      "text": "ツイート本文の文章2",
      "id": "xxxxxxxxxxxxxxxxxx"
    },

ところが、検索文字列に該当するツイートが存在しなかったときには次のようになります。この場合、「body('最近のツイート一覧を取得')['data']」の値を使用するときには「body('最近のツイート一覧を取得')」の中に「['data']」が何もないためnullとなります。

{
  "meta": {
    "result_count": 0
  }
}

ちなみに「8.最近のツイートデータを空に設定」でValueをnullではなく[]としています。

これは「最近のツイート一覧データ」の変数の値をnullになっていると、次回作成する「それぞれに適用する」アクションで使用するとエラーとなったためそのようにしています。

ところが、この記事作成時にその挙動を確認するとnullでもエラーになりません。

筆者の勘違いか最近仕様が変わったのかもしれません…



▼入れ子と条件アクション

Power Automateでは「条件」や「それぞれに適用する」で作成される入れ子数の上限が8となっています。

複雑なフローを作成する場合、この上限に達しないように工夫が必要になるかもしれません。

例えば、「アレイのフィルター処理」アクションで配列を絞り込む、「条件」アクションの条件の最適化によって入れ子を減らす方法が考えられます。


今回の記事で記載したフローでは、次のように入れ子を減らしています。


下記のようなフローでツイートデータが存在する場合、引き続きそのデータの処理を行う場合には【次の処理】の位置にアクションを追加することが考えられます。

ところがこの位置ではすでにいくつかの入れ子の中になっているため、さらに入れ子を作成したい場合にはその上限に近づきやすくなります。


次のように複数の入れ子の外に【次の処理】のアクションを追加できれば、すでに存在する入れ子の数が減ります。


本フローでは、後の処理で使用するデータのみを「varRecentTweetData」変数に格納しておき、それを【次の処理】以降のアクションで使用することで実現しています。

「最近のツイート一覧データあり?」アクションの処理を一度完結させているようなイメージです。



10.おわりに

 

次回は、ツイートデータをTeamsに投稿する処理を追加します。


Comments


Commenting has been turned off.
bottom of page