Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 在谷歌应用程序脚本中,如何在中间循环中进行二次查找_Google Apps Script_Google Sheets_Google Sheets Formula - Fatal编程技术网

Google apps script 在谷歌应用程序脚本中,如何在中间循环中进行二次查找

Google apps script 在谷歌应用程序脚本中,如何在中间循环中进行二次查找,google-apps-script,google-sheets,google-sheets-formula,Google Apps Script,Google Sheets,Google Sheets Formula,我相信这一定是非常直截了当的,但我不是一个开发人员,已经为此奋斗了一段时间,希望有人能帮助我 基本上,我有一个2D发票数组: Date | Total | Currency 2020-08-17 | 500 | GBP 2020-08-15 | 1000 | USD 我想添加第四列,将总额标准化为一种货币,在本例中为英镑 我有一个第二个汇率表,如下所示(但假设它将来可能有其他汇率): 我使用foreach遍历发票数组,并使用if语句来表示“如果货币为英镑,则总计保持不变”,但我需要表示“如果货

我相信这一定是非常直截了当的,但我不是一个开发人员,已经为此奋斗了一段时间,希望有人能帮助我

基本上,我有一个2D发票数组:

Date | Total | Currency
2020-08-17 | 500 | GBP
2020-08-15 | 1000 | USD
我想添加第四列,将总额标准化为一种货币,在本例中为英镑

我有一个第二个汇率表,如下所示(但假设它将来可能有其他汇率):

我使用foreach遍历发票数组,并使用if语句来表示“如果货币为英镑,则总计保持不变”,但我需要表示“如果货币为美元,则在汇率表中查找与发票日期匹配的日期并获取汇率”

以下是迄今为止的代码:

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);

}

我一直在看map,因为它似乎是最有效的解决方案,但我不会真的使用大数据集,所以也许我应该接受最容易理解的东西。

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

=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)
=if(和(C3“GBP”、isnumber(匹配(A3,‘汇率’!$A$2:$A,0))、B3*索引(‘汇率’!$B$2:$B、匹配(A3,‘汇率’!$A$2:$A,0))、B3)
结果:

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

=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)
=if(和(C3“GBP”、isnumber(匹配(A3,‘汇率’!$A$2:$A,0))、B3*索引(‘汇率’!$B$2:$B、匹配(A3,‘汇率’!$A$2:$A,0))、B3)
结果:

用于比较两个日期并检索相应的汇率:

case "USD":
  var date = receivablesRow[1];
  var exchangeRate = exchangeRateData.find(exchangeRateRow => exchangeRateRow[0].getTime() === date.getTime())[1];
  var TotalInGBP = total * exchangeRate;
  break;
注意:我假设汇率日期在A列,发票中的日期在B列,用于各自的表格。如果不是这样,请更改索引。

用于比较两个日期并检索相应的汇率:

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

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

这可以通过公式轻松完成?你会接受配方奶粉吗?你不也应该检查日期吗?这可以通过配方奶粉轻松完成吗?你会接受公式解决方案吗?你不也应该检查日期吗?嘿,伙计,谢谢你的建议,但这是更大的自动化部分。Zapier从财务软件包中提取信息并放入表格,然后运行一些应用程序脚本,这样我就不必在开具新发票时继续复制和粘贴公式,然后这些数据将在Google data Studio中报告。我会用vlookup,所以你教了我一些新东西,但不是我想要的:(嘿,伙计,谢谢你的建议,但这是一个更大的自动化项目的一部分。Zapier从财务软件包中提取信息并放入表格,然后运行一些应用程序脚本,这样我就不必在收到新发票时一直复制和粘贴公式,然后这些数据会在Google data Studio中报告。我会使用vloo库普,你教会了我一些新的东西,但不是我想要的:(