首页 > 解决方案 > 为什么带有 if 语句的 For 循环不起作用?

问题描述

我正在测试下面的代码以在它识别活动工作表第一列中的字符串时执行特定操作。字符串是“Ticker”。

我收到以下错误,不确定它是什么意思。我能得到一些帮助吗?

function extractOrders() {
  
  var app = SpreadsheetApp ;
  var ss = app.getActiveSpreadsheet();
  var EndRow = ss.getLastRow()
  
  for (i = 0; i < EndRow; i++) { 
        if (ss.getRange(i, 1).getValue() == "Ticker") { 
         
         Logger.log('ticker found')

        } 
}

}

//错误

//异常:参数(字符串,数字)与方法签名不匹配 //SpreadsheetApp.Spreadsheet.getRange。//extractOrders@extractOrders.gs:8

标签: google-apps-script

解决方案


修改点:

  • 在您的脚本中,ssofvar ss = app.getActiveSpreadsheet();是电子表格对象。你正在使用getRange这个对象的方法(类电子表格)。在这种情况下,当Class Spreadsheet的方法的官方文档时getRange,您只能看到getRange(a1Notation). RefgetRange(row, column)即,在 Class Spreadsheet中没有方法。我认为这是您的问题的原因The parameters (String,number) don't match the method signature //for SpreadsheetApp.Spreadsheet.getRange.
  • 而且,在你的 for 循环中for (i = 0; i < EndRow; i++) {,起始索引是0. 在这种情况下,当getRange(row, column)使用时,会发生错误。因为第一行是0。请注意这一点。

为了避免这些问题,下面的修改如何?

修改脚本1:

在此模式中,getRange(a1Notation)使用了 Class Spreadsheet。为此,请将工作表名称设置为Sheet1!A${i + 1}

function extractOrders() {
  var app = SpreadsheetApp;
  var ss = app.getActiveSpreadsheet();
  var EndRow = ss.getLastRow()
  for (i = 0; i < EndRow; i++) {
    if (ss.getRange(`Sheet1!A${i + 1}`).getValue() == "Ticker") {
      Logger.log('ticker found')
    }
  }
}

修改脚本2:

getRange(row, column)在这个模式中,为了使用getRange(row, column)Class Sheet 的使用。当使用 Class Sheet 时,getRange(row, column)可以使用 的方法。

function extractOrders() {
  var app = SpreadsheetApp;
  var ss = app.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var EndRow = ss.getLastRow()
  for (i = 0; i < EndRow; i++) {
    if (sheet.getRange(i + 1, 1).getValue() == "Ticker") {
      Logger.log('ticker found')
    }
  }
}
  • 上面的脚本使用活动工作表。当您要使用特定的工作表时,请修改var sheet = ss.getActiveSheet();var sheet = ss.getSheetByName("Sheet2);.

笔记:

  • 在您的脚本中,getValue在循环中使用。在这种情况下,处理成本会变高。例如,当行数很大时,处理时间很长。为了降低流程成本,作为另一种方法,为了实现您的目标,我想建议使用TextFinder。当使用 TextFinder 时,处理成本会有所降低。参考在此示例脚本中,搜索活动工作表的“A”列。

      function extractOrders() {
        var sheet = SpreadsheetApp.getActiveSheet();
        sheet.getRange("A1:A" + sheet.getLastRow()).createTextFinder("Ticker").findAll().forEach(r => {
          console.log(`ticker found at ${r.getA1Notation()}`);
        });
      }
    

参考:


推荐阅读