# Shopify Import Custom Query Integration V2

Shopify Import Connector V2—カスタムクエリは、ShopifyのGraphQL Admin APIと連携し、ユーザーが独自の必要なクエリを定義できるように設計されています。Shopify Import Integration V2で以前実装された機能を引き続き開発します。

新しいインポート操作を追加します：

- カスタムクエリインポート
  - 4種類のクエリをサポート：
- クエリ - 複数形のオブジェクトからの通常クエリ
- クエリ - 単数形のオブジェクトからの通常クエリ（idなどの必須フィールドによるフィルタが必要）
- 複数形のNODESを使用したクエリ
- 単数形のNODEを使用したクエリ


## 前提条件

- Treasure Dataの基本知識
- Shopifyの基本知識


## 必要なAPIスコープ

Shopifyアプリを設定する際は、インポートするターゲットに応じて以下のAPIスコープが付与されていることを確認してください。

| Target | 必要なスコープ |
|  --- | --- |
| `products` | `read_products` |
| `product_variants` | `read_products`、`read_inventory`、`read_translations` |
| `meta_fields` | `read_products` |
| `custom_query` | クエリで参照されているすべてのShopify Admin APIリソースに対応する`read_*`スコープが必要です。たとえば、製品と在庫レベルを読み取るクエリには、`read_products`と`read_inventory`の両方が必要です。[Shopify APIアクセススコープ](https://shopify.dev/docs/api/usage/access-scopes)を参照してください。 |


## 要件と制限事項

- Metafieldインポートの制限
  - 製品ごとに最大250個のmetafield
  - 製品バリアントごとに最大250個のmetafield
- Product Variantsのインポートは、created_atタイムスタンプによる増分読み込みをサポートしなくなりました。現在はupdated_atタイムスタンプによる読み込みのみをサポートしています。


## Treasure Data Integration の静的 IP アドレス

セキュリティポリシーで IP ホワイトリストが必要な場合は、接続を成功させるために Treasure Data の IP アドレスを許可リストに追加する必要があります。

リージョンごとに整理された静的 IP アドレスの完全なリストは、次のリンクにあります:
[IP Addresses for Integrations](/apis/endpoints/ip-addresses-integrations-result-workers)

## Treasure コンソール経由でShopifyレポートをインポートする

### 認証を作成する

最初のステップは、認証情報のセットで新しい認証を作成することです。

1. **Integrations Hub**を選択します。
2. **Catalog**を選択します。


![](/assets/integrationshub-catalog2.e33c0a4c7d81c40cc83dd056c2143b97b1406220e213cab14ef349d69412ffef.eedebb45.png)

1. CatalogでShopifyを検索し、アイコンの上にマウスを置いて**Create Authentication**を選択します。


![](/assets/shopifyi1.4f504665b75eb5d2d1b5f353f6a747aa3f7c1b5d2e55c08b2da6278ecd120a7b.fdf07543.png)
![](/assets/shopifyi2.63ac6cca8a3716b1317b6e19b72e58c952551c47e5b05c6eac4063d4d346b6a2.fdf07543.png)

1. **Credentials**タブが選択されていることを確認し、統合の認証情報を入力します。


![](/assets/image-20260318-191500.a79b3b0325aad6fd06372f8d3cf2b4d0cfbab8161891cb02456e16925d0784c3.fdf07543.png)
![](/assets/image-20260318-191519.0555658164ec12cf7d03b38e544c9d47949037c8af58bdfa4d26b54e1d38d2e4.fdf07543.png)

**新しい認証フィールド**

| パラメータ | 説明 |
|  --- | --- |
| Store name
 | Shopifyストアのストア識別子。これは2つの形式で入力できます：
- 完全なストアURL：例 `https://mountbaker.myshopify.com`
- ストア名のみ：例：`mountbaker`

ストア名のみを使用する場合は、`.myshopify.com`ドメインを除いたストアの一意の識別子である必要があります。
 |
| Auth method | 使用する認証方法を選択します:- **Static Token** — 2026年1月1日以前に作成されたレガシーアプリの永続的なAdmin APIアクセストークンを使用します。
- **Client Credentials** — Shopify Dev DashboardによってサポートされるClient IDとClient Secretを使用します（2026年1月1日以降に作成された新しいアプリに必要）。

 |
| Admin API access token | *（Auth methodがStatic Tokenの場合に必須）* ShopifyのAdmin APIで認証するために使用される永続的なアクセストークン。このトークンは、Shopify管理パネルの**Apps > Develop apps > Create an app > Configure Admin API scopes**から生成できます。 |
| Client ID | *（Auth methodがClient Credentialsの場合に必須）* アプリのShopify Dev DashboardによってサポートされるClient ID。 |
| Client Secret | *（Auth methodがClient Credentialsの場合に必須）* アプリのShopify Dev DashboardによってサポートされるClient Secret。 |


1. **Continue**を選択します。
2. 認証の名前を入力し、**Done**を選択します。


### カスタムクエリソースを作成する

認証がコンソールで使用可能になったら、インポートジョブを設定します。

1. Treasure コンソールを開きます。
2. **Integrations Hub > Authentications**に移動します。
3. Shopify認証を見つけて、**New Source**を選択します。


### 接続を作成する

1. Data Transfer Nameフィールドにソース名を入力します。
2. **Next**を選択します。


| パラメータ | 説明 |
|  --- | --- |
| Data Transfer Name | 転送の名前を入力します。 |
| Authentication | このフィールドには、Shopifyとの接続に使用される認証の名前が含まれます。 |


### ソーステーブルを識別する

1. ソーステーブルのフィールドを設定します


![](/assets/screenshot-2025-05-06-at-13.27.54.44a6e83a7378638f2f5f2c2f736373c846ea1e278ef39ecfd801bb4608e3afd4.41035e72.png)

| Field | Description |
|  --- | --- |
| Source
 | 次のShopifyオブジェクトを含むドロップダウンメニュー：
- Product
- Product Variants
- Meta Fields
- Custom Query

Shopifyストアからインポートするデータを含むShopifyオブジェクトを選択します。
 |
| Incremental? | 有効にすると、コネクタは最後のインポート実行以降の新しいデータまたは更新されたデータのみをインポートし、後続のインポートがより効率的になります。 |
| Incremental field | 増分読み込みに使用するタイムスタンプを選択します：- created_at — 作成日で製品をフィルタします。
- updated_at — 最終更新日で製品をフィルタします。

 |
| Custom data filter field | データフィルタに使用するタイムスタンプを選択します。Custom Queryソースでは、定義されたカスタムクエリで{{date_filter}}を使用してデータをフィルタすることをサポートしています：- created_at — 作成日で製品をフィルタします。
- updated_at — 最終更新日で製品をフィルタします。

 |
| Start date | データのエクスポートを開始する開始タイムスタンプ（形式：dd/mm/yyyy, hh:mm） |
| End date | データのエクスポートを終了する終了タイムスタンプ（形式：dd/mm/yyyy, hh:mm）。空白のままにすると、終了日は現在時刻になります。 |
| Custom Query | ユーザー独自のカスタムクエリを設計します。2つのプレースホルダーオプションを使用できます：- ***{{incremental_filter}}**:*** カスタムクエリで使用して増分を使用します（必須）。開始日と終了日を入力します（オプション）。
例：

```
{ products(first: 250, query: "{{incremental_filter}}") { pageInfo { hasNextPage  endCursor } .... } }
```
- ***{{date_filter}}:*** カスタムクエリで使用して日付フィルタを使用します（オプション）。開始日と終了日を入力します（オプション）。
例：

```
{ products(first: 250, query: "{{date_filter}}") { pageInfo { hasNextPageendCursor } .... } }
```
- **注意：** カスタムクエリでページネーションを使用する場合は、カスタムクエリに追加してください。

```
pageInfo {hasNextPageendCursor }
```

 |


1. **Next**を選択します。


### データ設定を定義する

1. データ設定を構成します。
![](/assets/screenshot-2025-05-06-at-13.46.15.7052b5e417d51ffd1e1d8602a21c89a49c88d50b63521022d86774165e33483f.41035e72.png)


| パラメータ | 説明 |
|  --- | --- |
| Retry Limit | インポートが失敗するまでの再試行回数。 |
| Initial retry time wait in millis | 再試行する前に待機する初期時間（ミリ秒単位）。 |
| Max retry wait in millis | 再試行する前に待機する最大時間（ミリ秒単位）。 |
| Schema Settings | スキーマはサンプルデータから推測されました。PREVIEWとRUNの前にタイプと形式を変更できます。 |


- **注意：**
  - JSONフィールドのトップレベル1のみをサポートします。JSONオブジェクトのキーと値のペアの解析はサポートしていません。
  - データを取得するには、JSONフィールドをstringからJSONデータタイプに変更することを忘れないでください。通常、推測されたフィールドデータタイプはstringです。
  - 必要がない場合は、フィールド名を変更しないでください。
  - カスタムクエリで何かを変更した後は、スキーマ設定を再度確認して編集する必要があります。


### Data Preview

インポートを実行する前に、Generate Preview を選択してデータの[プレビュー](/products/customer-data-platform/integration-hub/batch/import/previewing-your-source-data)を表示できます。Data preview はオプションであり、選択した場合はダイアログの次のページに安全にスキップできます。

1. **Next** を選択します。Data Preview ページが開きます。
2. データをプレビューする場合は、**Generate Preview** を選択します。
3. データを確認します。


### Data Placement

データの配置について、データを配置したいターゲット database と table を選択し、インポートを実行する頻度を指定します。

1. **Next** を選択します。Storage の下で、インポートされたデータを配置する新しい database を作成するか、既存の database を選択し、新しい table を作成するか、既存の table を選択します。
2. **Database** を選択 > **Select an existing** または **Create New Database** を選択します。
3. オプションで、database 名を入力します。
4. **Table** を選択 > **Select an existing** または **Create New Table** を選択します。
5. オプションで、table 名を入力します。
6. データをインポートする方法を選択します。
  - **Append** (デフォルト) - データインポートの結果は table に追加されます。
table が存在しない場合は作成されます。
  - **Always Replace** - 既存の table の全体の内容をクエリの結果出力で置き換えます。table が存在しない場合は、新しい table が作成されます。
  - **Replace on New Data** - 新しいデータがある場合のみ、既存の table の全体の内容をクエリの結果出力で置き換えます。
7. **Timestamp-based Partition Key** 列を選択します。
デフォルトキーとは異なるパーティションキーシードを設定したい場合は、long または timestamp 列をパーティショニング時刻として指定できます。デフォルトの時刻列として、add_time フィルターで upload_time を使用します。
8. データストレージの **Timezone** を選択します。
9. **Schedule** の下で、このクエリを実行するタイミングと頻度を選択できます。


#### 一度だけ実行

1. **Off** を選択します。
2. **Scheduling Timezone** を選択します。
3. **Create & Run Now** を選択します。


#### 定期的に繰り返す

1. **On** を選択します。
2. **Schedule** を選択します。UI では、*@hourly*、*@daily*、*@monthly*、またはカスタム *cron* の 4 つのオプションが提供されます。
3. **Delay Transfer** を選択して、実行時間の遅延を追加することもできます。
4. **Scheduling Timezone** を選択します。
5. **Create & Run Now** を選択します。


転送が実行された後、**Data Workbench** > **Databases** で転送の結果を確認できます。

## ワークフロー経由でShopifyレポートをインポートする

td_load>: src_idを使用してワークフロー経由でShopifyレポートからデータをインポートできます。既にソースを作成している場合は実行できます。ソースを作成したくない場合は、.ymlファイルを使用してインポートできます。

### ソースを使用する

1. **Integrations Hub>Sources**を選択します。
2. 画面の右端のFiltersペインで、Integration Typeドロップダウンメニューを使用して**Shopify V2**を選択します。
3. Sourcesペインで、使用するソースを含む行を識別し、その行のmore（•••アイコン）ドロップダウンメニューを使用して**Copy Unique ID**を選択します。


![](/assets/26617502.09d9b84b0f1f752c7c95b0bc1c2d8e8b7302e5b91c6a3cb5f01309dadf53a604.25ec5a77.png)

1. ワークフロータスクを定義し、td_load>:にステップ3でコピーしたIDを使用します。



```yaml
+load:
   td_load>: unique_id_of_your_source
   database: ${td.dest_db}
   table: ${td.dest_table}
```

1. ワークフローを実行します。


### .ymlファイルを使用する

1. .ymlファイルを識別します。


.ymlファイルを作成する必要がある場合は、[Create Seed Config File (seed.yml)](/ja/int/amazon-s3-import-integration-v2#AmazonS3ImportIntegrationv2-CreateSeedConfigFile(seed.yml))に記載されている手順を参照してください。
2. ワークフロータスクを定義し、td_load>: に.ymlファイルを指定します。


```yaml
+load:
  td_load>: config/daily_load.yml
  database: ${td.dest_db}
  table: ${td.dest_table}
```

1. ワークフローを実行します。


#### サンプルワークフローコード

サンプルワークフローコードについては、[Treasure Boxes](https://github.com/treasure-data/treasure-boxes/tree/master/td_load/s3)をご覧ください。

## CLI (Toolbelt) を使用したShopifyからのインポート

統合を設定する前に、最新バージョンの[TD Toolbelt](https://toolbelt.treasuredata.com/)をインストールしてください。

### ロードファイルの準備

Static Token (Legacy)

```yaml
in:
  type: shopify_v2
  admin_api_access_token: xxxxxxxx
  target: custom_query
  store_name: xxxxxxx
  from_date: '2024-12-31T17:00:00.000Z'
  incremental_field: created_at
  incremental: true
  query: |
    {
      products(first: 10, query: "{{incremental_filter}}") {
        pageInfo {
            hasNextPage
            endCursor
          }
          edges {
            node {
              id
              title
              productType
              createdAt
              ...
            }
          }
        }
    }
out:
  mode: replace
```

Client Credentials (OAuth)

```yaml
in:
  type: shopify_v2
  auth_method: CLIENT_CREDENTIALS
  client_id: xxxxxxxx
  client_secret: xxxxxxxx
  target: custom_query
  store_name: xxxxxxx
  from_date: '2024-12-31T17:00:00.000Z'
  incremental_field: created_at
  incremental: true
  query: |
    {
      products(first: 10, query: "{{incremental_filter}}") {
        pageInfo {
            hasNextPage
            endCursor
          }
          edges {
            node {
              id
              title
              productType
              createdAt
              ...
            }
          }
        }
    }
out:
  mode: replace
```

認証方法
- **Static Token**: 2026年1月1日以前に作成されたレガシーカスタムアプリには`admin_api_access_token`を使用します。これがデフォルトです（`auth_method`のデフォルトは`STATIC_TOKEN`）。
- **Client Credentials**: 2026年1月1日以降、Shopifyはレガシーカスタムアプリによる永続的なトークンの作成を許可しなくなりました。新しいアプリは、Shopify Dev DashboardからのClient IDとClient Secretと共に`auth_method: CLIENT_CREDENTIALS`を使用する必要があります。トークンはコネクタによって自動的に更新されます。


**パラメータリファレンス**

| 名前 | 説明 | 値 | デフォルト値 | 必須 |
|  --- | --- | --- | --- | --- |
| type | インポートのソース。 | `"shopify_v2"` |  | はい |
| auth_method | 使用する認証方法。 | String。次のいずれか:- `"STATIC_TOKEN"` — 永続的なAdmin APIアクセストークンを使用します。
- `"CLIENT_CREDENTIALS"` — Client IDとClient Secretを使用します（OAuth 2.0 Client Credentials Grant）。

 | `"STATIC_TOKEN"` | いいえ |
| admin_api_access_token | ShopifyのAdmin APIで認証するために使用される永続的なアクセストークン。`auth_method`が`STATIC_TOKEN`の場合に必須。このトークンは、Shopify管理パネルの**Apps > Develop apps > Create an app > Configure Admin API scopes**から生成できます。 | String |  | はい（`auth_method`が`STATIC_TOKEN`の場合） |
| client_id | Shopify Dev DashboardによってサポートされるClient ID。`auth_method`が`CLIENT_CREDENTIALS`の場合に必須。 | String |  | はい（`auth_method`が`CLIENT_CREDENTIALS`の場合） |
| client_secret | Shopify Dev DashboardによってサポートされるClient Secret。`auth_method`が`CLIENT_CREDENTIALS`の場合に必須。 | String |  | はい（`auth_method`が`CLIENT_CREDENTIALS`の場合） |
| target | データを収集するソース | String. `"custom_query"` |  | はい |
| store_name
 | Shopifyストアのストア識別子。これは次の2つの形式で入力できます:
- 完全なストアURL: 例 `https://mountbaker.myshopify.com`
- ストア名のみ: 例: `mountbaker`

ストア名のみを使用する場合は、`.myshopify.com`ドメインを除いたストアの一意の識別子にする必要があります。
 | String
 |  | はい
 |
| incremental | レポートのグループ化に使用するメトリクスのリスト。許可される値はレポートタイプによって異なります。 | Boolean | `false` | いいえ |
| incremental_field | 増分ロードに使用するタイムスタンプ。 | String. `"created_at"` または `"updated_at"` | `created_at` | いいえ |
| date_filter_field | 定義されたカスタムクエリで `{{date_filter}}` を使用してデータをフィルタリングするために使用するタイムスタンプ | String. `"created_at"` または `"updated_at"` | `created_at` | いいえ |
| start_date | データのエクスポートを開始する開始タイムスタンプ | String. フォーマット: `yyyy-MM-dd'T'HH:mm:ss.SS'Z'` |  | いいえ |
| end_date | データのエクスポートを終了する終了タイムスタンプ | String. フォーマット: `yyyy-MM-dd'T'HH:mm:ss.SS'Z'` |  | いいえ |
| query | ユーザー独自に設計したカスタムクエリ。2つのプレースホルダーオプションが使用できます:- `{{incremental_filter}}`: カスタムクエリで増分を使用するために使用します（必須）
- `{{date_filter}}`: カスタムクエリで日付フィルタを使用するために使用します（オプション）
- **注意:** カスタムクエリでページネーションを使用する場合は、カスタムクエリに追加してください。

 | String |  | はい |


データを推測するには、
`td connector:guess`
コマンドを使用します。(最初にguessを使用してスキーマを推測し、"columns"プロパティで期待通りにスキーマを変更する必要があります)。


```bash
$ td connector:guess guess.yml
```


```yaml
in:
  type: shopify_v2
  admin_api_access_token: xxxxxxxx
  target: custom_query
  store_name: xxxxxxx
  from_date: '2024-12-31T17:00:00.000Z'
  incremental_field: created_at
  incremental: true
  query: |
    {
      products(first: 10, query: "{{incremental_filter}}") {
        pageInfo {
            hasNextPage
            endCursor
          }
          edges {
            node {
              id
              title
              productType
              createdAt
              ...
              ...
              ...
            }
          }
        }
    }
out:
  mode: replace
```

データをプレビューするには、
`td connector:preview`
コマンドを使用します。


```
$ td connector:preview load.yml
```

### ロードジョブの実行

データのサイズによっては、数時間かかる場合があります。データを保存するTreasure Dataデータベースとテーブルを必ず指定してください。Treasure Dataのストレージは時間で分割されているため、--time-columnオプションを指定することをお勧めします([データパーティショニング](https://docs.treasuredata.com/smart/project-product-documentation/data-partitioning-in-treasure-data)を参照)。このオプションが指定されていない場合、データコネクタは最初のlongまたはtimestamp列をパーティショニング時間として選択します。--time-columnで指定される列の型は、longまたはtimestamp型のいずれかである必要があります。

データに時間列がない場合は、*add_time*フィルターオプションを使用して時間列を追加できます。詳細については、[add_time Filter Function](https://docs.treasuredata.com/smart/project-product-documentation/add_time-filter-function)のドキュメントを参照してください。


```
$ td connector:issue load.yml --database td_sample_db --table td_sample_table \--time-column created_at
```

connector:issueコマンドは、データベース(td_sample_db)とテーブル(td_sample_table)が既に作成されていることを前提としています。データベースまたはテーブルがTDに存在しない場合、このコマンドは失敗します。データベースとテーブルを手動で作成するか、td connector:issueコマンドで--auto-create-tableオプションを使用してデータベースとテーブルを自動作成してください。


```
$ td connector:issue load.yml --database td_sample_db --table td_sample_table--time-column created_at --auto-create-table
```

データコネクタはサーバー側でレコードをソートしません。時間ベースのパーティショニングを効果的に使用するには、事前にファイル内のレコードをソートしてください。

timeというフィールドがある場合は、--time-columnオプションを指定する必要はありません。


```
$ td connector:issue load.yml --database td_sample_db --table td_sample_table
```

### インポートモード

load.ymlファイルのout:セクションでファイルインポートモードを指定します。out:セクションは、データがTreasure Dataテーブルにインポートされる方法を制御します。たとえば、既存のテーブルにデータを追加したり、データを置き換えたりすることができます。

| **モード** | **説明** | **例** |
|  --- | --- | --- |
| Append | レコードがターゲットテーブルに追加されます。 | 
```yaml
in:
  ...
out:
  mode: append
```
 |
| Always Replace | ターゲットテーブルのデータを置き換えます。ターゲットテーブルに対して手動で行われたスキーマの変更は保持されます。 | 
```yaml
in:
  ...
out:
  mode: replace
```
 |
| Replace on new data | インポートする新しいデータがある場合にのみ、ターゲットテーブルのデータを置き換えます。 | 
```yaml
in:
  ...
out:
  mode: replace_on_new_data
```
 |


### 実行のスケジューリング

増分ファイルインポートのために、定期的なデータコネクタの実行をスケジュールできます。Treasure Dataスケジューラは高可用性を確保するために最適化されています。

スケジュールされたインポートでは、指定されたプレフィックスに一致し、次のいずれかの条件を満たすすべてのファイルをインポートできます:

- use_modified_timeが無効になっている場合、最後のパスは次の実行のために保存されます。2回目以降の実行では、統合はアルファベット順で最後のパスの後に来るファイルのみをインポートします。
- それ以外の場合、ジョブが実行された時刻が次の実行のために保存されます。2回目以降の実行では、コネクタはその実行時刻以降にアルファベット順で変更されたファイルのみをインポートします。


### TD Toolbeltを使用したスケジュールの作成

新しいスケジュールは、td connector:createコマンドを使用して作成できます。


```
$ td connector:create daily_import "10 0 * * *" \td_sample_db td_sample_table load.yml
```

Treasure Dataのストレージは時間で分割されているため、--time-columnオプションを指定することもお勧めします([データパーティショニング](https://docs.treasuredata.com/smart/project-product-documentation/data-partitioning-in-treasure-data)を参照)。


```
$ td connector:create daily_import "10 0 * * *" \td_sample_db td_sample_table load.yml \--time-column created_at
```

cronパラメータは、@hourly、@daily、@monthlyの3つの特別なオプションも受け入れます。

デフォルトでは、スケジュールはUTCタイムゾーンで設定されます。-tまたは--timezoneオプションを使用して、タイムゾーンでスケジュールを設定できます。--timezoneオプションは、Asia/Tokyo、America/Los_Angelesなどの拡張タイムゾーン形式のみをサポートします。PST、CSTなどのタイムゾーン略語はサポートされておらず、予期しないスケジュールになる可能性があります。