【问题标题】:Google scripts: Updating a column from a different tab only when numbers go up谷歌脚本:仅当数字上升时才从不同的选项卡更新列
【发布时间】:2021-07-09 23:16:55
【问题描述】:

我正在尝试创建一个数据库,用于记录与 Black Desert Online 的 API 相关的商品最高价格。第一列是项目的索引号,第二列是此代码从API Prices Tab 发布到MaxPrice Tab 的市场价格:

function readSalesNum() {
var sheetFrom = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Prices");
var sheetTo = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("MaxPrice");

// Copy from 2nd row, 5th column, all rows for one column 
var index = sheetFrom.getRange(2, 2, sheetFrom.getLastRow(), 1).getValues();
var marketprice = sheetFrom.getRange(2, 5, sheetFrom.getLastRow(), 1).getValues();

//Item name overwrites itself
sheetTo.getRange(1,1,index.length,1).setValues(index);
sheetTo.getRange(1,2,index.length,1).setValues(marketprice);
}

我需要跟踪所有商品的最高售价。 API 每 30 分钟更新一次。在 BDO 中,开发人员强制执行的所有项目都有市值。这就是为什么最初脚本会每 2 小时发布一个包含更新价格的新列,然后 =MAX 以查找该项目的当前最高价格。但是,如果将新项目添加到 API(按字母顺序),则会扭曲所有数据

我需要一个脚本来查看 MaxPrices 中的 A 列,在价格中找到匹配的数字,然后将当前市场价格发布到 MaxPrices 中的 B 列。如果“价格”选项卡中每个项目的当前市场价格上涨,则仅更新 MaxPrices 中的 B 列。

【问题讨论】:

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


    【解决方案1】:

    希望命令的文本足够清晰,以便阅读和理解。我在getValues() 的末尾添加了slice(1) 以省略标题行。

      function myFunction() {
        var sheetTo = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("MaxPrice");
        var data = sheetTo.getDataRange().getValues().slice(1);
        var maxPrices = Object.fromEntries(data.map(([id, price]) => [id, price]));
        
        var sheetFrom = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Prices");
        data = sheetFrom.getDataRange().getValues().slice(1);
        
        data.forEach(row => {
          let id = row[1]; // column 2
          let price = row[4]; // column 5
          maxPrices[id] = maxPrices[id] === undefined ? price : Math.max( price, maxPrices[id])
        });
      
        var output = Object.entries(maxPrices).map(row => [...row]);
        sheetTo.getRange(2, 1, output.length, output[0].length).setValues(output);
      }
    

    【讨论】:

    • 成功了!太感谢了!!终于可以用这个了
    【解决方案2】:

    好的,所以我们需要创建一个现有的最高价格列表,将它们与新价格进行比较/更新,添加新商品。

    function myFunction() {
      var sheetFrom = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Prices"); 
      var sheetTo = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("MaxPrice");
    
      //three steps
    
      //1. create dictionary of MaxPrices from MaxPrice sheet
      var data = sheetTo.getDataRange().getValues();
      var maxPriceData = {}
      for (var i=1; i<data.length;i++){maxPriceData[data[0]]=data[1]}
    
      //2. Compare current prices from column E of the Prices to the dictionary
      data = sheetFrom.getDataRange().getValues();
      for (var i=1; i<data.length;i++)
      {
        var itemId = data[i][1];//B
        var basePrice = data[i][4];//E
        if (itemId in maxPriceData ){
          if (basePrice > maxPriceData[itemId]) maxPriceData[itemId] = basePrice;//updates dictionary if new price higher
        }else{
          maxPriceData[itemId]=basePrice;//adds new item to the item list
        }
      }
    
      //3. Update MaxPrice spreadsheet
      var output = [];
      for (key in maxPriceData){
        var itemId = key;
        var price = maxPriceData[key];
        output.push([itemId,price]);
      }
      
      sheetTo.getRange(2, 1,output.length, output[0].length).setValues(output);
    
    }
    

    我没有根据实际数据对此进行测试,因此可能有一两个错字。

    【讨论】:

    • 我尝试了您的代码,并对其进行了编辑以匹配数据源页面。但是,如果价格选项卡中的价格发生变化,它似乎不会在 MaxPrice 选项卡中保持最高值。即使价格在“价格”选项卡中下降,我也需要它始终保持每件商品的最高价格。 Data source page 此方法也不起作用,因为 API 会跟踪 30 天内的总销量,这通常比价格高得多。
    • 这是我制作的视频,希望能帮助您了解我想要完成的工作:youtube.com/watch?v=QCZEpjbdsmA
    • 啊!好吧,看看实际价格标签要好得多。最终,您是否需要像当前一样复制新价格,或者只跟踪 g 列中曾经见过的最高最高价格?此外,它是一个不同的 MMO 是有道理的。我想知道您为什么不让 TSM 为您处理!
    • 最终,我只需要使用索引号(B 列)跟踪“价格”选项卡(E 列)中每个项目的最高最高价格。如果通过 API 自动将新商品添加到价格选项卡中,则 MaxPrice 选项卡中的数据不会出现偏差。例如:添加了新商品,现在所有价格都相差了一行,使得所有 = VLOOKUP 在该新商品之后的结果不准确。 imgur.com/a/F7IYzhf哈哈,是的,我觉得如果是魔兽世界,这样做会容易得多。XD
    • TBH 我完全放弃了这个 O.o.我将添加您编写的内容并开始测试它。我真的不能感谢你!谢谢谢谢谢谢!
    猜你喜欢
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多