どのようにAPIを介してGoogleスプレッドシートにLinnworksからすべての在庫項目を取得するには?


数日前、私はLinnWorks(LW)とGoogleスプレッドシートを接続する簡単なスクリプトを書いた.これはLWのAPIを使用してLWからGoogleスプレッドシートにすべての在庫アイテムを取得します.スクリプトはGoogle Appsのスクリプトで書かれており、Google Workspaceの中でタスクを自動化し、Google APIを外部APIに接続するための言語です.言語は本質的に現代的なJavaScriptですが、そのサービスで主要なGoogle API(スプレッドシート、ドキュメントなど)へのアクセスを持つことの利点で.私はGoogle Appsのスクリプトについての最も好きなのは、スプレッドシートに埋め込まれている、無料でホストされ、スケジュールに実行するトリガに置くことができます.

このプロジェクトに必要なもの
LWから必要なのはAPIトークンだけです.で指定された指示を使用してAPIトークンを生成できますhelp page . 要約すると、APIトークンを取得するには、次の手順に従います.
  • LWで開発者アカウントを作成するApplication Id and Application Secret .
  • を使用するAPI endpoint APIトークンを得るために.
  • LWアプリケーションを認証した後、2つの重要なキーを含む応答オブジェクトを受信している必要があります.
  • として返されたAPIトークンToken
  • Server , URL文字列の作成は重要です.次のようになります.https://eu-ext.linnworks.net
  • これらの2つの情報をどこかにコピーしてください.次の手順で必要です.

    スプレッドシートファイルを作成する
  • 新しいシートを作成する-あなたが書くことによって新しいシートファイルを作成するために使用するきちんとした小さなトリックを使用することができますsheet.new あなたのブラウザで.
  • スプレッドシートで、ツール→スクリプトエディタに移動します.
  • これは、我々がすべての我々のコードを書いているエディタです.

    プロジェクトをステップへ
  • 最初のAPI呼び出しを行い、データを取得する🤓
  • do - while APIが1 API呼び出しで200のオブジェクトだけを返すので、ループはすべてのストックアイテムを得るために😟
  • 応答を解析し、データフィールドを取得します🦾
  • パースしたオブジェクトをシートにペーストする📝

  • 1 .最初のAPI呼び出しの作成
    function getLWStockItems(){
      const URL = 'PASTE_SERVER_HERE/api/Stock/GetStockItemsFull'
      const payload = {
          'keyword': '',
          'loadCompositeParents': 'True',
          'loadVariationParents': 'False',
          'entriesPerPage': '200',
          'pageNumber': 1,
          'dataRequirements': '[0,1,2,3,7,8]',
          'searchTypes': '[0,1,2]'
        }
        var response = UrlFetchApp.fetch(URL, {
          method: 'post',
          headers: {
            'Authorization': 'YOUR_LW_TOKEN'
          },
          'contentType': 'application/json',
          'payload': JSON.stringify(payload),
          muteHttpExceptions: true
        })
        console.log(response.getResponseCode())
        console.log(response.getContentText())
    }
    
    上記の関数は200 ステータスコードと200の在庫アイテムの巨大な配列.payload objectはリクエストの本文でAPIが受け入れるものです. UrlFetchAPP.fetch() Google AppsスクリプトでHTTPリクエストを作成する方法です.

    2 - whileループ
    のパラメータの一つpayload オブジェクトはpageNumber . 我々はすべてのページとすべての株式の項目のオブジェクトを取得するまで、それをインクリメントするには、このページ番号フィールドを使用することができます.APIは400を返し、ループを中断します.コードは次のようになります.
    function getLWStockItems() {
    let allProducts = []
    const URL = 'PASTE_SERVER_HERE/api/Stock/GetStockItemsFull'
    let startingPageNo = 1
    
      do {
        const payload = {
          'keyword': '',
          'loadCompositeParents': 'True',
          'loadVariationParents': 'False',
          'entriesPerPage': '200',
          'pageNumber': startingPageNo,
          'dataRequirements': '[0,1,2,3,7,8]',
          'searchTypes': '[0,1,2]'
        }
        console.log(payload.pageNumber)
        var response = UrlFetchApp.fetch(URL, {
          method: 'post',
          headers: {
            'Authorization': 'YOUR_LW_TOKEN'
          },
          'contentType': 'application/json',
          'payload': JSON.stringify(payload),
          muteHttpExceptions: true
        })
        console.log(response.getResponseCode())
        if (response.getResponseCode() === 200){
        const jsonRes = JSON.parse(response.getContentText())
        allProducts = allProducts.concat(jsonRes)
        startingPageNo++
        }
      } while (response.getResponseCode() !== 400)
    console.log('Total stock objects: ', allProducts.length)
    return allProducts
    }
    
    この関数は、startingPageNo 変数.APIが次に200のステータスコードを返すならallProducts 配列が連結されます.APIが400を返すとすぐにwhile ループブレークと我々は帰りますallProducts 配列.この時点で、我々はLWからのすべての在庫アイテムをパースし、シートに貼り付けている.

    レスポンスを解析する
    function parseResponse(){
      const stocksData = getLWStockItems()
      const stockItemsToWrite = []
      try{
      for (let item of stocksData){
        const suppliersData = item.Suppliers
        const itemProperties = item.ItemExtendedProperties
        const images = item.Images
        const stockLev = item.StockLevels
        let imageLink = ""
        let itemsObj = {}
        let supplierObj = {}
        for (let supplier of suppliersData){
          if(supplier.IsDefault){
            supplierObj["supplierName"] = supplier.Supplier
            supplierObj["supplierCode"] = supplier.Code
            supplierObj["supplierBarcode"] = supplier.SupplierBarcode
            supplierObj["supplierPP"] = supplier.PurchasePrice
          }
        }
        for (let property of itemProperties){
          if(property.ProperyName === "export-two-tone"
          || property.ProperyName === "export-postage"
          || property.ProperyName === "HSTariffCode"
          || property.ProperyName === "CountryOfOrigin"
          || property.ProperyName === "ShippingDescription"
          || property.ProperyName === "CountryOfOriginISO"
          ){
            itemsObj[property.ProperyName] = property.PropertyValue
          }
        }
    
        for (let image of images){
          if(image.IsMain){
            imageLink = image.FullSource
          }
        }
    
        for (let stock of stockLev){
          if(stock.Location.LocationName === "Default"){
            var availableStock = stock.Available
          }
        }
      stockItemsToWrite.push([
        item.ItemNumber,
        item.ItemTitle,
        item.BarcodeNumber,
        item.CategoryName,
        item.PurchasePrice,
        item.RetailPrice,
        supplierObj["supplierName"],
        supplierObj["supplierCode"],
        supplierObj["supplierBarcode"],
        supplierObj["supplierPP"],
        itemsObj['CountryOfOrigin'],
        itemsObj['CountryOfOriginISO'],
        itemsObj['export-postage'],
        itemsObj['export-two-tone'],
        itemsObj['HSTariffCode'],
        itemsObj['ShippingDescription'],
        item.PackageGroupName,
        imageLink,
        availableStock
      ])
      itemsObj = {}
      supplierObj = {}
      imageLink = ""
      }
      }catch(erorr){
        console.log("some error while parsing: ", erorr)
      }
      // writing to the sheet
      writeToSheet(stockItemsToWrite, "Sheet1")
    }
    
    この関数では、デフォルトのサプライヤー、拡張項目のプロパティ、画像、ストックレベルに関連するフィールドを取得することに興味があります.フィールドをパースした後、stockItemsToWrite 2次元配列です.2 D配列は、スプレッドシートAPIが2 D配列形式でペーストされるデータを受け入れるので、つくられます.

    データをシートに貼り付ける
    function writeToSheet(data, sheetName) {
      const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName)
      try {
      // removes the previously exisiting data
        sheet.getRange(2, 1, sheet.getLastRow() - 1, sheet.getLastColumn()).clear({ formatOnly: true, contentsOnly: true })
      } catch (error) {
        console.log(error)
      }
      sheet.getRange(2, 1, data.length, data[0].length).setValues(data)
    }
    
    上記の関数は、2 D配列を選択したシートに貼り付けます.

    フルスクリプト
    あなたは完全なスクリプトを得ることができますmy github .
    読書ありがとう.