【问题标题】:Filter a CSV daily and get the diferences between the last day每天过滤 CSV 并获取最后一天之间的差异
【发布时间】:2019-10-14 06:14:48
【问题描述】:

我正在与一家供应商合作,该供应商每天都会给我一个包含库存更新的 CSV。我需要使用导入工具将其上传到我的 cms 网站。让一切变得更快很酷,但我遇到了一些问题:

  • 提供的 CSV 与导入工具的配置不同。 没问题,我用一个简单的 Query 和 Importrange 做了一个过滤器,得到了我需要的列。

  • 供应商的分类不好,所以,我需要自动列出类别并自己制作。 没问题,我用类别做了=UNIQUE,我写了自己的类别。之后,通过一个简单的 vlookup,我得到了一个包含正确类别的列。

现在,我有了自己的 CSV 过滤器,所以我可以这么快地上传它。

但是现在,我有一个更大的问题。我需要从网站更新库存,并添加新产品。

我的 cms 与Refer Number 一起更新,因此,我只需要生成一个包含要更新的产品的 CSV,然后导入它。而对于新产品,也一样,我只需要找到新产品并导入即可。

这里的问题是,我怎样才能从库存和新产品中获得变化?

我尝试将所有 CSV 保存在同一张表中以获取最后一张表之间的差异,但我们谈论的是每张表 9k 行,所以这给了我一些问题。

我有一些想法,例如,为每个新的 CSV 文件使用过滤器文档,并且比较过滤后的工作表比原始 CSV 更好。

但我需要高效地完成它,因为它每天都要做。

我不需要代码或类似的东西,只需要一些想法即可。我可以搜索、学习和理解大部分东西,所以,这不是问题。

我的过滤器文档在这里有一个示例:https://docs.google.com/spreadsheets/d/1jfq1h4gnKbdoKrI7J260lXXKzXbkusbzn2cQcURPjCo/edit?usp=sharing

如果您需要我提供更多信息,我可以告诉您一切。

对不起我的英语,我是西班牙人,我仍然很难解释自己。

【问题讨论】:

  • 您可以在示例表中添加所需的输出吗?我正在阅读您的问题,但无法说出您在问什么
  • 对不起,如果我不能解释我自己。
  • 想象一些简单的事情,例如,我每天都有一个包含一些更新的 CSV,使用该 CSV,我需要我自己的两个 CSV,一个包含新产品,另一个包含库存变化。有意义吗?
  • 欢迎。请您编辑您的电子表格以包含您的 CMS 的 CSV 示例。
  • 您正在尝试解决“库存变化和新产品”的问题。我理解这意味着 1) 如果供应商有新产品,那么您想要将这些新产品添加到 CMS,以及 2) 对于 CMS 上的所有产品,您想要更新最新的库存数量。您能否就 CMS 上出现的产品解释一下您的过滤条件(“Min-Qty-to-sell=1”和“Available=Yes”)的含义?

标签: google-apps-script google-sheets filter


【解决方案1】:

您有两个 CSV 文件已导入 Google 表格。一份来自您的供应商,提供新产品和现有产品的库存详细信息;您已对其进行过滤以获取正确格式的数据。另一个来自您的 CMS - 它是当前 CMS 数据的输出。

您要检查所有新产品是否都已添加到 CMS,以及所有现有产品的库存详细信息是否已更新到 CMS。您还可以选择检查 CMS 上的所有产品是否都在供应商列表中,并且“Minimum-to-Sell-Quantity”是否保持等于 1。

以下代码未经测试,但反映了建议的策略。如果我误解了您的意图,我深表歉意。

  • 使用 Javascript map 方法,创建 CMS 中所有参考编号的列表。
  • 使用 Javascript indexOf 方法,遍历过滤后的供应商数据中的值,并检查 CMS 列表中的每个参考编号。
    • CMS 列表中存在该编号 - 这是现有产品,因此请更新库存
    • CMS 列表中不存在该编号 - 这是新产品,因此请在 CMS 中创建新产品。

作为双重检查,您可以反转该过程以确保 i) CMS 列表中的每个数字都存在于过滤后的供应商列表中,并且 ii) “最小销售数量”仍然是一个单位。那些在供应商列表中找不到的 CMS 产品可以写入错误表并进行审查。


function so5836302201() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var cmsname = "CSV EXAMPLE";
  var cms = ss.getSheetByName(cmsname);
  var filtername = "FILTER"
  var filter = ss.getSheetByName(filtername);
  var cmserrorsname = "cms errors";
  var cmserrors = ss.getSheetByName(errorsname);

  // get cms data
  var cmsLR = cms.getLastRow();
  var cmsLC = cms.getLastColumn();
  var cmsRange = cms.getRange(2,1,cmsLR-1,cmsLC);
  var cmsValues = cmsRange.getValues();

  // get filter data
  var filterLR = filter.getLastRow();
  var filterLC = filter.getLastColumn();
  var filterRange = filter.getRange(2,1,cmsLR-1,cmsLC);
  var filterValues = filterRange.getValues();

  // setup cms errors sheet


  // "My cms works with Refer Number to update"
  // check every product from filter to cms
  // if not exist in cms; then update cms as new 
  // if exist in cms, then update cms for stock

  // cms reference number: assume the reference number is in column E of the cms=> column 4(zero-based)
  // cms reference number: assume the reference number is in column B of the filter=> column 1(zero-based)

  // get an array of reference numbers from the CMS
  var cmsRefNum = cmsValues.map(function(e){return e[4];});//[[e],[e],[e]]=>[e,e,e]
  //Logger.log(cmsRefNum); // DEBUG


  // loop though filter and find ref num in cms
  for (var i = 0;i<filterValues.length;i++){

    Logger.log("DEBUG: i="+i+", Filter Ref Num: "+filterValues[i][1])

    var filterresult = cmsValues.indexOf(filterValues[i][1]);
    if (filterresult === -1){
      // -1 means this is a new product
      // include cope to add this product to cms
    }
    else{
      // if not -1, the Filter product exists on cms
      // include code to update stock only    
      // you might also test that Suppliers Min-Qty-to-Sell remains = 1
    }

  }

  // belt and braces
  // loop through cms and ensure that stock item was on filter.
  var filterRefNum = filterValues.map(function(e){return e[1];});//[[e],[e],[e]]=>[e,e,e]
  //Logger.log(filterRefNum); // DEBUG
  var cmsmissingdata=[]
  for (var i=0;i<cmsValues.length;i++){
    var cmstemp=[];
    Logger.log("DEBUG: i="+i+", CMS Ref Num: "+cmsValues[i][4])
    var cmsresult = filterValues.indexOf(cmsValues[i][4]);
    if (cmsresult === -1){
      // -1 means this product wasn't on the Filter 
      // include this product on an error report.
      cmstemp.push(filterValues[i][0]);
      cmstemp.push(filterValues[i][1]);
      cmstemp.push(filterValues[i][2]);
      cmsmissingdata.push(cmstemp);
    }

    // delete existing cmserrors
    var errorsLR = cmserrors.length;
    var errorsLC = 3;
    var errorsRange = cmserrors.getRange(2,1,errorsLR,errorsLC);
    errorsRange.clearContent();


    if (cmserrors.length !=0){
      // there are errors - write them to 
      var errorsLR = cmserrors.length;
      var errorsLC = 3;
      var errorsRange = cmserrors.getRange(2,1,cmsLR-1,cmsLC);
      cmserrors.setValues(cmsmissingdata);
    }
  }

}

【讨论】:

    猜你喜欢
    • 2020-04-30
    • 2022-01-13
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 2018-04-14
    • 2016-07-18
    相关资源
    最近更新 更多