ONLYOFFICEマクロを使ってShopifyで注文を追跡する方法

現代において、Eコマースは地理的な障壁を取り除き、恒常的な収入の流れを促進する貴重なツールとなっています。そのため、注文情報を管理・追跡することは、成功するビジネス戦略の重要な一部となるでしょう。この記事では、Shopifyから注文データを取得し、スプレッドシートに挿入するマクロの作成方法をご紹介します。

**ご注意**：このマクロはONLYOFFICEエディターの[デスクトップ版](https://www.onlyoffice.com/ja/desktop.aspx?utm_source=qiita&utm_medium=article+&utm_id=shopify_macro)でのみ動作します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655664/f23fc8af-f9ac-7101-147d-450fb0f5fcdb.png)

## Shopifyについて

Shopifyは、個人や企業がオンラインストアを作成し、管理することを可能にする主要なeコマースプラットフォームです。商品販売、在庫管理、注文処理、店頭のカスタマイズを支援する包括的なツールと機能を提供しています。

Shopify APIは、開発者がShopifyと対話し、機能を拡張するための強力なインターフェイスとして機能します。開発者が独自のアプリケーション、システム、またはサービスを Shopify ストアにシームレスに統合することを可能にする、幅広いメソッドとエンドポイントを提供します。

## マクロの構築

まず、以下の変数を宣言します：

```
 const TOKEN = 'YOUR_API_TOKEN'
    const SHOP_ID = 'YOUR_SHOP_ID'
    const URL = `https://${ SHOP_ID }.myshopify.com/admin/api/2022-10/orders.json`
    const LABELS = [
        'order id', 
        'total price', 
        'tax', 
        'shipping address'
    ]
```

TOKEN と SHOP_ID 変数には、それぞれ実際の Shopify API トークンとショップ ID が格納されます。URL 変数には、Shopify ストアから注文を取得するための API リクエストの完全な URL が格納されます。LABEL 変数はテーブルのカラムのラベルを含む配列です。これは、スプレッドシートでデータを表示する順序を指定します。各ラベルはテーブルのカラムに対応しています。

次に makeRequest 関数を組み込み、指定した Shopify API エンドポイントへの GET リクエストを開始します：

```
function makeRequest() {
        $.ajax({
            method: 'GET',
            headers: {
                // 'Access-Control-Allow-Origin': '*',
                'Content-Type' : 'application/json',
                'X-Shopify-Access-Token': TOKEN
            },
            url: URL,
            dataType: 'json',
        }).done(successFunction)
    }
```

この $.ajax リクエストでは、コンテンツタイプや Shopify API トークンなど、必要なヘッダーを設定します。また、注文を取得するためのShopify APIエンドポイントとして、データ型とURLを指定します。

その後、successFunctionでレスポンスを処理します：

```
    function successFunction(data) {
        if (data.orders === undefined) return
        
        let table = LABELS.map(label => [label])
        const oWorksheet = Api.GetActiveSheet()
        const oRange = oWorksheet.GetRange(`A1:D${data.orders.length + 1}`)
        data.orders.forEach(order => {
            table[0].push(order.id.toString())
            table[1].push(order.current_total_price)
            table[2].push(order.current_total_tax)
            // if missing field
            if (order.shipping_address === undefined) {
                table[3].push(order.billing_address.address1.toString())
            } else {
                table[3].push(order.shipping_address.address1.toString())
            }
        })
        
        oRange.SetValue(table)
```

この関数は、注文情報を含むレスポンスを表す data をパラメータとして受け取ります。関数の最初の行は、data.ordersプロパティが未定義かどうかをチェックします。undefinedの場合、レスポンスに注文がないことを意味するので、関数は早期に戻ります。次に、LABELS配列とmapメソッドを使用して、各ラベルをテーブルの別の行として持つ新しい配列を作成します。各ラベルは配列にカプセル化され、テーブルの1つのセルを表します：

```
  function successFunction(data) {
        if (data.orders === undefined) return
        
        let table = LABELS.map(label => [label])
 
        })
```

その後、ONLYOFFICEドキュメントのアクティブシートを取得し、注文データを挿入する範囲を定義します。範囲はセルA1からDまでとし、その後に注文数に1を加えたものとします。data.orders.length+1は、テーブルのラベル行を考慮するために使用されます：

 const oWorksheet = Api.GetActiveSheet()
 const oRange = oWorksheet.GetRange(`A1:D${data.orders.length + 1}`)
このブロックでは、data.orders配列の各注文オブジェクトをループで反復処理します。各注文について、関連する情報がテーブル配列の対応するカラムにプッシュされます：

```
 data.orders.forEach(order => {
            table[0].push(order.id.toString())
            table[1].push(order.current_total_price)
            table[2].push(order.current_total_tax)
            // if missing field
            if (order.shipping_address === undefined) {
                table[3].push(order.billing_address.address1.toString())
            } else {
                table[3].push(order.shipping_address.address1.toString())
            }
        })
```

もう少し詳しく見てみましょう：

* order.id.toString()は、注文IDを文字列として取得し、最初のカラム(table[0])にプッシュします。
* order.current_total_priceとorder.current_total_taxは、それぞれ2番目と3番目の列（table[1]とtable[2]）にプッシュされます。
* 配送先住所（order.shipping_address.address1）がチェックされる。存在する場合は、4番目の列（table[3]）にプッシュされます。そうでなければ、請求先住所（order.billing_address.address1）が使用されます。

最後に、テーブル配列はONLYOFFICEドキュメント内の指定された範囲に挿入されます。SetValueメソッドは、範囲内のセルの値を設定し、テーブルに注文データを入力します：

```
 oRange.SetValue(table)
 reload()
```

マクロコード全体は以下の通りです：

```
(function()
{
    const TOKEN = 'YOUR_API_TOKEN'
    const SHOP_ID = 'YOUR_SHOP_ID'
    const URL = `https://${ SHOP_ID }.myshopify.com/admin/api/2022-10/orders.json`
    const LABELS = [
        'order id', 
        'total price', 
        'tax', 
        'shipping address'
    ]
    makeRequest()
    function makeRequest() {
        $.ajax({
            method: 'GET',
            headers: {
                // 'Access-Control-Allow-Origin': '*',
                'Content-Type' : 'application/json',
                'X-Shopify-Access-Token': TOKEN
            },
            url: URL,
            dataType: 'json',
        }).done(successFunction)
    }
    function successFunction(data) {
        if (data.orders === undefined) return
        let table = LABELS.map(label => [label])
        const oWorksheet = Api.GetActiveSheet()
        const oRange = oWorksheet.GetRange(`A1:D${data.orders.length + 1}`)
        data.orders.forEach(order => {
            table[0].push(order.id.toString())
            table[1].push(order.current_total_price)
            table[2].push(order.current_total_tax)
            // if missing field
            if (order.shipping_address === undefined) {
                table[3].push(order.billing_address.address1.toString())
            } else {
                table[3].push(order.shipping_address.address1.toString())
            }
        })
        oRange.SetValue(table)
        reload()
    }
})();
```
このマクロはShopifyの注文情報にアクセスし、分析するための便利なツールです。

ただし、このマクロは私たちのAPIメソッドを使用できる多くの方法の一つに過ぎないことにご注意ください。 ONLYOFFICEのマクロは非常に多用途に使えますので、実験や独自のスクリプトの作成を歓迎します。あなたのアイデアやマクロを私たちと自由に共有してください。私たちはいつでも議論と協力を歓迎します。

## お役立ちリンク

* [ONLYOFFICEマクロのサンプル](https://api.onlyoffice.com/plugin/macrosamples?utm_source=qiita&utm_medium=article+&utm_id=shopify_macro&_ga=2.86946268.533859570.1690375448-2010401340.1681826884)
* [ONLYOFFICE Spreadsheet API](https://api.onlyoffice.com/docbuilder/spreadsheetapi?utm_source=qiita&utm_medium=article+&utm_id=shopify_macro&_ga=2.86946268.533859570.1690375448-2010401340.1681826884)
* [ONLYOFFICEのGithubページ](https://github.com/ONLYOFFICE)
* [ONLYOFFICEマクロで詳細な住所情報を取得する方法](https://www.onlyoffice.com/blog/ja/2023/06/onlyoffice-22?utm_source=qiita&utm_medium=article+&utm_id=shopify_macro)