我有20,000条记录的产品信息ScriptDB,我希望每小时更新当前的价格/股票信息。 就目前而言,我无法设计出一些不会对执行限制产生任何影响的事情。
下载的stockfile是可自定义的,目前我把它作为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);
如果没有,任何明显的方法来提高效率?
谢谢!
答案 0 :(得分:2)
如果这是你要达到的6分钟运行时限制,那么只需(a)使你的工作具有幂等性,并(b)一次又一次地运行它直到你的工作完成。
要做(a) - 您可以“记住”您在电子表格中使用的是什么或将它们作为lineitems,并添加“完成”列。
要做(b),在你的主循环中,如果你超过5分钟且不到6分钟,你可以退出并重新安排作业,在10分钟内再次运行(或更少,但你需要锁定)
答案 1 :(得分: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 documentation。)
但是,您可以将产品存储在单个对象中,而不是对象数组,并将SKU用作对象属性。你仍然需要遍历输入,但是你只需要调用ScriptDB服务而不是数千个。
试试这个:
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”对象的外观。如果你可以按一下你的输入数据,你可能会得到你梦寐以求的一遍写作!
注意:我使用了price
和price_default
,但我怀疑这是一个错字。