google-apps-script - 为什么带有 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
解决方案
修改点:
- 在您的脚本中,
ss
ofvar 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()}`); }); }
参考:
推荐阅读
- c# - 铸造工作,但不能转换有什么区别,为什么
- laravel - 在 Laravel Eloquent Query 中使用 unaccent PostgreSQL 函数
- sql-server - 将 XML 键值对转换为字符串
- javascript - 在执行脚本之前等待 Jinja 完全完成页面渲染
- assembly - 判断原始源文件是否包含函数调用?
- html - 如果我在下方编写代码,我如何查看上方
- postgresql - pgadmin 更新后无法登录
- angular - 是否可以根据它所在的父组件在可重用的子组件中执行函数?
- google-places-api - 为什么某些邮政编码不由地点/详细信息(对于给定的 place_id)提供,即使它们是由地点/自动完成返回的
- angular - 如何在角度 6 中获取 ngSelect 下拉列表的选定文本和选定值