javascript - 尝试使用表格作为数据库来更新 WooCommerce 中的价格

标签 javascript google-apps-script google-sheets woocommerce

因此,我尝试使用一张表作为价格数据库,通过 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 header 获取所有 header ,但由于我正在测试 ATM,所以我没有使用它。因此,如果我从 WooCoommerce 获得大约 15-20 种产品,一切都很顺利,我会获取所有产品数据,创建一个包含 sku、id 和价格的新数组。然后将该数组与我工作表中具有更新价格值的数组进行比较,然后将 sku、id 和更新价格推送到新数组并将该数组发布到 woocommerce 批量更新。工作正常,如果我尝试处理更多,我会收到此错误:

类型错误:无法读取未定义的属性“价格”

我真的很伤脑筋,主要是因为我是 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 }

确切的错误

17:07:38    Error   
TypeError: Cannot read property 'price' of undefined
getDataloopwoo  @ JSONsheet.gs:63

有问题的工作表,以防有人想查看我正在使用的数据类型。

const data = codigos.map etc

使用2个变量,SKU和PRICE,作为简单对象,分别是表单中的A列和B列。

编辑:

好的,可以使用 CK 和 CS key 将测试表复制到测试 WooCommerce 站点。

https://docs.google.com/spreadsheets/d/14afFyj1geaNCWt_e4DE9S41wlgepWAtasK2z5_u1hdc/edit?usp=sharing

如果按原样运行,无需执行任何其他操作即可重现。

试过 20 页有效,45 页无效。

我不确定我还能做些什么来使其可重现。

  • 我真的不明白问题的根源是什么。

最佳答案

修改点:

  • 在您的情况下,containersku 值似乎不存在于 data_obj 的 sku 值中。我认为您的问题的原因可能是由于此。
  • 作为检查这个的脚本,您可以为您的脚本使用 const res = container.filter(e => !data_obj[e.sku])。在这种情况下,返回 [ { sku: 'L4943-0ULT', id: 3195, price: '5083.33' } ]。从示例电子表格中搜索此值时,会找到 l4943-0ult。在这种情况下,字符大小写不同。这样,您的问题就出现了。我导致你的问题的原因是因为这个。

当这个issue去掉后,下面的修改怎么样?

来自:

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语句中没有key,添加如下修改怎么样?

来自:

if (data_subObj.price > container_subObj.price) {

收件人:

if (data_subObj && data_subObj.price > container_subObj.price) {

关于javascript - 尝试使用表格作为数据库来更新 WooCommerce 中的价格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70687818/

相关文章:

javascript - vue-good-table 日期格式 2019-02-26T02 :11:56. 308466-08:00

javascript - 如何在悬停时制作 gif 动画,悬停后恢复正常

javascript - 如何通过传递参数从 .gs 文件中的方法调用 "somename.html"?

java - 执行成功,但没有结果?

javascript - 谷歌应用程序脚本,用于根据另一个单元格的值对一个单元格进行条件颜色格式化

if-statement - TEXTJOIN 只在条件满足时才加入?

javascript - 使用 HTML5 Canvas 的更高 DPI 图形

google-chrome - Chrome 更新后无法在 Google Apps Script 网络应用程序中下载文件

google-sheets - 将重复的列组逆透视为行

javascript - 将嵌套的 knockout View 模型传递给 Controller