因此,我嘗試使用單張表作為價格資料庫,通過 Woo API 使用 fetch 更新 WooCommerce 中的價格。它有效,我的問題是它顯然取決于資料集的大小?我不確定,因為我無法理解錯誤。
更新代碼
function getDataloopwoo() {
const ck = 'ck_fd0992917fbbb0464d4146ad5861f51adcb36369';
const cs = 'cs_6f8061efce415355fb6cac520bd1506ad126578a';
const website = 'https://www.atopems-desarrollo.com.ar';
const optionsGet =
{
'method': 'GET',
'contentType': 'application/x-www-form-urlencoded;charset=UTF-8',
'muteHttpExceptions': true,
};
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('PreciosBULK');
const codigos = sheet.getRange('A2:A').getValues();
const precios = sheet.getRange('B2:B').getValues();
const data = codigos.map(function(codigos, indice) {
return {
sku: codigos[0],
price: precios[indice][0]
}
})
const container = [];
var surl = website '/wp-json/wc/v3/products?consumer_key=' ck '&consumer_secret=' cs '&per_page=100' '&orderby=id' '&order=asc' '&status=publish' '&page=1';
var url = surl
Logger.log(url)
var result = UrlFetchApp.fetch(url, optionsGet);
var headers = result.getAllHeaders();
var total_pages = 45;
var pages_count = 0;
while (pages_count < total_pages) {
if (result.getResponseCode() == 200) {
var wooProducts = JSON.parse(result.getContentText());
//Logger.log(result.getContentText());
}
for (var i = 0; i < wooProducts.length; i ) {
//Logger.log(i);
container.push({
sku: wooProducts[i]['sku'],
id: wooProducts[i]['id'],
price: wooProducts[i]['price']
});
}
pages_count ;
if (pages_count < total_pages) {
var surl = website '/wp-json/wc/v3/products?consumer_key=' ck '&consumer_secret=' cs '&per_page=100' '&orderby=id' '&order=asc' '&status=publish' '&page=' (pages_count 1);
var url = surl
var result = UrlFetchApp.fetch(url, optionsGet);
Logger.log(url);
}
}
var data_obj = {}
for (let obj of data)
data_obj[obj.sku] = {'price': obj.price};
console.log(data_obj);
var container_obj = {}
for (let obj of container)
container_obj[obj.sku] = {'price': obj.price, 'id': obj.id};
console.log(container_obj);
const output = [];
for (let sku in container_obj) {
let data_subObj = data_obj[sku];
let container_subObj = container_obj[sku];
if (data_subObj.price > container_subObj.price) {
output.push({'id':container_subObj.id, 'regular_price':data_subObj.price});
}
}
console.log(output);
var temporary, chunk = 100;
for (let i = 0;i < output.length; i = chunk) {
temporary = output.slice(i, i chunk);
var payloadUp = {
update: temporary
}
var headPost =
{
'method' : 'POST',
'contentType': 'application/json',
'payload': JSON.stringify(payloadUp)
};
console.log(payloadUp);
var urlPost = website '/wp-json/wc/v3/products/batch?consumer_key=' ck '&consumer_secret=' cs;
var result = UrlFetchApp.fetch(urlPost, headPost);
console.log(urlPost);
if (result.getResponseCode() == 200) {
console.log(result.getContentText());
};
}
}
我使用 var 標頭來獲取所有標頭,但由于我正在測驗 ATM,所以我不使用它。因此,如果我從 WooCoommerce 獲得大約 15-20 種產品,一切都像魅力一樣,我會獲得所有產品資料,創建一個包含 sku、id 和價格的新陣列。然后將該陣列與我的作業表中的陣列與更新后的價格值進行比較,然后將 sku、id 和更新后的價格推送到新陣列并將該陣列發布到 woocommerce 批量更新。作業正常,如果我嘗試處理更多我會收到此錯誤:
TypeError: Cannot read property 'price' of undefined
我真的很傷腦筋,主要是因為我是 JS 的新手。
我會發布日志,
Logger.log(url);
https://atopems.com/wp-json/wc/v3/products?consumer_key=ck_xxx&consumer_secret=cs_xxx&per_page=100&orderby=id&order=asc&status=publish&page=51
console.log(data_obj);
Logging output too large. Truncating output. { '200': { price: 299.98 },
'201': { price: 156.9 },
'202': { price: 112.05 },
'203': { price: 100.58 },
'204': { price: 126.33 },
'205': { price: 126.53 },
'206': { price: 2858.42 },
'207': { price: 2336.79 },
'208': { price: 401.25 },
'209': { price: 378.32 },
'210': { price: 282.78 },
'211': { price: 252.21 },
'212': { price: 292.34 },
'213': { price: 309.53 },
'214': { price: 385.96 },
'215': { price: 554.1 },
console.log(container_obj);
Logging output too large. Truncating output. { '60026': { price: '2319.6', id: 24942 },
'60032': { price: '4050.7', id: 24943 },
'60033': { price: '4050.7', id: 24944 },
'60119': { price: '7195.72', id: 24945 },
BR9010: { price: '984.5', id: 24067 },
BR9013: { price: '1744.32', id: 24068 },
BR9014: { price: '1869.03', id: 24069 },
BR9015: { price: '1869.03', id: 24070 },
BR9016: { price: '984.5', id: 24071 },
BR9017: { price: '747.66', id: 24072 },
BR9026: { price: '664.52', id: 24073 },
BR9037: { price: '830.62', id: 24074 },
BR9042: { price: '830.62', id: 24075 },
BR9043: { price: '747.66', id: 24076 },
BR9048: { price: '1204.44', id: 24077 },
BR9049: { price: '955.23', id: 24078 },
BR9050: { price: '955.23', id: 24079 },
BR9052: { price: '1079.9', id: 24080 },
BR9055: { price: '955.23', id: 24081 },
BR9056: { price: '1266.63', id: 24082 },
BR9059: { price: '955.23', id: 24083 },
BR9067: { price: '830.62', id: 24084 },
BR9068: { price: '1349.13', id: 24085 }
The exact error
17:07:38 Error
TypeError: Cannot read property 'price' of undefined
getDataloopwoo @ JSONsheet.gs:63
The sheet in question, in case anyone wants to see the type of data I'm working with.
const data = codigos.map etc
uses 2 variables, SKU and PRICE, which are column A and B respectively in the sheet as simple objects.
EDIT:
Ok, Test sheet that can be copied with CK and CS Keys to a testing WooCommerce site.
https://docs.google.com/spreadsheets/d/14afFyj1geaNCWt_e4DE9S41wlgepWAtasK2z5_u1hdc/edit?usp=sharing
If run as is it can be reproduced without doing anything else.
Tried with 20 pages it works, with 45 it doesn't.
I'm not sure what more I could do to make it reproducible.
- I legit don't understand what could be the root of the problem.
uj5u.com熱心網友回復:
修改點:
sku在您的情況下, of的值似乎container不存在于 of 的值sku中data_obj。我認為您的問題的原因可能是由于這個。- 作為檢查這一點的腳本,您可以將
const res = container.filter(e => !data_obj[e.sku])其用于您的腳本。在這種情況下,[ { sku: 'L4943-0ULT', id: 3195, price: '5083.33' } ]回傳。當從您的示例電子表格中搜索此值時,l4943-0ult會找到。在這種情況下,字符大小寫是不同的。這樣,您的問題就出現了。我導致你的問題的原因是由于這個。
當這個問題被洗掉后,接下來的修改如何?
從:
data_obj[obj.sku] = {'price': obj.price};
到:
data_obj[isNaN(obj.sku) ? obj.sku.toUpperCase() : obj.sku] = {'price': obj.price};
和,
從:
container_obj[obj.sku] = {'price': obj.price, 'id': obj.id};
到:
container_obj[isNaN(obj.sku) ? obj.sku.toUpperCase() : obj.sku] = { 'price': obj.price, 'id': obj.id };
另外,為了避免 if 陳述句中沒有鍵,添加以下修改怎么樣?
從:
if (data_subObj.price > container_subObj.price) {
到:
if (data_subObj && data_subObj.price > container_subObj.price) {
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/410886.html
標籤:
