【问题标题】:How do I do a secondary lookup in the middle of a foreach loop in Google Apps Script如何在 Google Apps 脚本的 foreach 循环中间进行二次查找
【发布时间】:2020-09-09 01:13:02
【问题描述】:

我确信这一定很简单,但我不是开发人员,并且已经为此苦苦挣扎了一段时间,希望有人能提供帮助。

基本上我有一个二维发票数组:

Date | Total | Currency
2020-08-17 | 500 | GBP
2020-08-15 | 1000 | USD

我想添加第 4 列以将总数标准化为一种货币,在本例中为 GBP。

我有一个像这样的辅助汇率表(但假设它将来可能有其他汇率):

Date | USD-to-GBP
2020-08-18 | 0.75
2020-08-17 | 0.745
2020-08-16 | 0.749
2020-08-15 | 0.740

我正在使用 foreach 遍历发票数组,并有一个 if 语句说“如果货币是 GBP,那么总金额保持不变”,但我需要说“如果货币是 USD,则在汇率表匹配发票日期并获取汇率'

这是目前为止的代码:

function GBPTotal() {
  
  var ss = SpreadsheetApp.getActive();

  // Getting data from the zapier populated spreadsheet
  var receivablesSheet = ss.getSheetByName("zap receivable");
  var receivablesLastRow = receivablesSheet.getLastRow();
  var receivablesData = receivablesSheet.getRange(2,1,receivablesLastRow-1,4).getValues();
  
  // Getting data from the exchange rates table
  var exchangeRateSheet = ss.getSheetByName("Exchange Rates");
  var exchangeRateLastRow = exchangeRateSheet.getLastRow();
  var exchangeRateData = exchangeRateSheet.getRange(2,1,5,3).getValues();
  
  var totalInGBPArray = [];
  receivablesData.forEach(function(receivablesRow){
    
    var total = receivablesRow[2];
    var currency = receivablesRow[3];
    
    // Switch to detect the currency and act accordingly
   switch (currency) {
   case "GBP":
     var TotalInGBP = total;
     break;
   case "USD":
     /**** HELP - EXCHANGE RATE LOOKUP IN HERE *****/
     break;
    }
   
    receivablesRow.push(TotalInGBP);
    totalInGBPArray.push([TotalInGBP]);
    
});

//Logger.log(totalInGBPArray);

receivablesSheet.getRange(2,5,receivablesLastRow-1,1).setValues(totalInGBPArray);

}

我正在查看地图,因为它似乎是最高效的解决方案,但我不会真正使用大数据集,所以也许我应该接受最容易理解的任何东西。

【问题讨论】:

  • 这可以通过公式轻松完成?你会接受公式解决方案吗?
  • 你不应该也检查日期吗?

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


【解决方案1】:

我会用一个简单的公式来解决这个问题:

=if(AND(C3<>"GBP",isnumber(match(A3,'Exchange Rates'!$A$2:$A,0))),B3*index('Exchange Rates'!$B$2:$B,match(A3,'Exchange Rates'!$A$2:$A,0)),B3)

结果:

【讨论】:

  • 嘿伙计,感谢您的精彩建议,但这是更大自动化部分的一部分。 Zapier 从财务包中提取信息并放入表格中,然后运行一些应用程序脚本,这样我就不必在提出新发票时继续复制和粘贴公式,然后这些数据将在 Google Data Studio 中报告。我会使用 vlookup,所以你教会了我一些新东西,但遗憾的是,我没有学到什么:(
【解决方案2】:

使用find比较两个日期并检索对应的汇率:

case "USD":
  var date = receivablesRow[1];
  var exchangeRate = exchangeRateData.find(exchangeRateRow => exchangeRateRow[0].getTime() === date.getTime())[1];
  var TotalInGBP = total * exchangeRate;
  break;

注意:我假设汇率日期在 A 列中,发票中的日期在各自表格的 B 列中。如果不是这种情况,请更改索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-25
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多