0

20,000レコードのScriptDBの製品情報があり、現在の価格/在庫情報で1時間ごとに更新したいと考えています。現状では、実行制限に真っ向からぶつからないものを設計するのに苦労しています。

ダウンロードしたストックファイルはカスタマイズ可能です。現在、次のようにJSONとして使用しています。

[
{"sku":"MYSKU1","price":14.99,"qty":2},
{"sku":"MYSKU2","price":22.99,"qty":25},
{"sku":"MYSKU3","price":91.99,"qty":31}
]

現在、私は次のようなことをしています。

var prod_feed = UrlFetchApp.fetch("https://www.site.com/myJSONfile").getContentText();
var prod_data = JSON.parse(prod_feed);
var prod_qty = 0, i = 0;
var prod_code = "";
var prod_price = "";

var db = ScriptDb.getMyDb();
var result_array = [];
var result_current = {};
var time_obj = dbDateObject();

for(i = 0; i < prod_data.length; i++) {

    var result = db.query({sku: prod_data[i]["sku"]}).next(); // result will be null if no match

    if (!result) {
    // No match, create new object with this SKU for insertion
      result = {};
      result["sku"] = prod_data[i]["sku"];
    }

    result["qty"] = prod_data[i]["qty"];
    result["price_default"] = prod_data[i]["price"];
    result["last_product_update"] = time_obj;
    result_array[i] = result;

}

var results = db.saveBatch(result_array, false);

この方法で約2,500のレコードを実行し、制限時間に達する前にそれらを保存できます。

SKUをレコードIDとして直接使用する方法はありますか?次に、実際には3行のコードになります...

var prod_feed = UrlFetchApp.fetch("https://www.site.com/myJSONfile").getContentText();
var prod_data = JSON.parse(prod_feed);
var results = db.saveBatch(prod_data, false);

そうでない場合、この効率を高めるための明白な方法はありますか?

ありがとう!

4

2 に答える 2

2

到達しているのが6分の実行時間制限である場合は、(a)べき等にし、(b)作業が完了するまで何度も実行します。

実行するには(a)-現在のSKUを「記憶」するか、スプレッドシートの項目としてそれらを使用して、「完了」列を追加できます。

(b)を行うには、メインループで、5分以上6分未満の場合、ジョブを終了して再スケジュールし、10分以内に再度実行することができます(ただし、ロックが必要になります)。

于 2013-01-17T04:16:14.930 に答える
2

SKUをレコードIDとして直接使用する方法はありますか?

悲しいことに、違います。Every ScriptDb object has an id, assigned by the system when it is stored, which is an opaque, immutable string value.ScriptDbドキュメント。)

ただし、オブジェクトの配列の代わりに、SKUをオブジェクト属性として使用して、製品を単一のオブジェクトに格納することもできます。入力をループする必要がありますが、ScriptDBサービスへの呼び出しは数千回ではなく2回だけです。

これを試して:

  var prod_feed = UrlFetchApp.fetch("https://www.site.com/myJSONfile").getContentText();
  var prod_data = JSON.parse(prod_feed);

  var db = ScriptDb.getMyDb();
  var result = db.query({type: "products"});
  var products = {};
  if (result.hasNext()) {
    // Projects database object already exists
    products = result.next();
  }
  else {
    // Not found, so create the Projects database object.
    var product_data = new Object();
    products = {type: "products", data: product_data};
  }

  var time_obj = dbDateObject();

  for (var i = 0; i < prod_data.length; i++) {

    if (!(prod_data[i]["sku"] in products.data)) {
      // No match, create new object with this SKU for insertion
      products.data[prod_data[i]["sku"]] = {};
    }

    // Update info for this item
    var item = products.data[prod_data[i]["sku"]];
    item.qty = prod_data[i].qty;
    item.price_default = prod_data[i].price;
    item.last_product_update = time_obj;
  }

  var results = db.save(products);

これはデバッガーからのスクリーンショットで、ScriptDbから取得したときの「products」オブジェクトがどのように見えるかを示しています。入力データを少しマッサージできれば、夢のワンパス書き込みを取得できる可能性があります。

'products'オブジェクトのデバッガスクリーンショット

注:私はあなたがしたように使用priceしましprice_defaultた...しかし、それはタイプミスだと思います。

于 2013-01-17T15:23:51.640 に答える