VBA字符串匹配函数转Google Apps Script报错求助
VBA字符串匹配函数转Google Apps Script报错解决
我熟悉VBA,但对Google Apps Script了解不多,想把VBA里的matchstring字符串匹配函数转成Apps Script代码。自己尝试转换后出现两个错误:
input1.getRow不是函数SpreadsheetApp.Sheet.getRange参数不匹配
原VBA代码
Function matchstring(input1) as String Dim ws As Worksheet Set ws = Worksheets("sheet1") lastrow = ws.Range("B" & ws.Rows.Count).End(xlUp).Row + 1 row2 = ws.Range("E1").Row col2 = ws.Range("E1").Column c = False row3 = row2 row1 = input1.Row col1 = input1.Column While c = False And row3 < lastrow 'Check A' a = input1.Value b = ws.Cells(row3, col2).Value d = ws.Cells(row3, col2 - 3).Value e = Cells(row1, col1 - 3).Value i = 1 'Check B' f = ws.Cells(row3, col2).Value g = ws.Cells(row3, col2 - 1).Value h = "Spain" 'Check C' i = ws.Cells(row3, col2).Value j = ws.Cells(row3, col2 - 2).Value k = Cells(row1, col1 - 2).Value If InStr(1, a, b, 1) And e = d And j = k And g = h Then c = True matchstring = b Else row3 = row3 + 1 c = False End If Wend End Function
尝试的Apps Script代码
function matchstring(input1) { var ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("sheet1"); var lastrow = ws.getRange("B" + ws.getLastRow()).getNextDataCell(SpreadsheetApp.Direction.UP).getRow() + 1; var row2 = ws.getRange("E1").getRow(); var col2 = ws.getRange("E1").getColumn(); var c = false; var row3 = row2; var row1 = input1.getRow; var col1 = input1.getColumn; while (!c && row3 < lastrow) { // Check A var a = input1.getA1Notation; var b = ws.getRange(row3, col2).getA1Notation(); var d = ws.getRange(row3, col2 - 3).getA1Notation(); var e = ws.getRange(row1, col1 - 3).getA1Notation(); // Check B var g = ws.getRange(row3, col2 - 1).getA1Notation(); var h = "Spain"; // Check C var j = ws.getRange(row3, col2 - 2).getA1Notation(); var k = ws.getRange(row1, col1 - 2).getA1Notation(); if (a.indexOf(b) !== -1 && e === d && j === k && g === h) { c = true; return b; } else { row3++; c = false; } } }
错误原因与修正方案
核心错误点
- 方法调用缺失括号:
getRow、getColumn、getA1Notation都是方法,必须加括号调用(如input1.getRow()),否则会被当作属性引用,导致"不是函数"的错误。 - 错误获取单元格内容:用
getA1Notation()获取的是单元格地址(如E5),而非单元格内的值,应该用getValue()获取内容,这也是getRange参数报错的间接原因。 - 工作表作用域不明确:原VBA中
Cells(row1, col1 - 3)默认指向当前工作表,在Apps Script中必须明确指定工作表(如ws.getRange(...)),否则会引发作用域错误。
修正后的完整代码
function matchstring(input1) { const ws = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("sheet1"); // 匹配原VBA逻辑,获取B列最后数据行+1 const lastRow = ws.getRange("B" + ws.getLastRow()).getNextDataCell(SpreadsheetApp.Direction.UP).getRow() + 1; const col2 = ws.getRange("E1").getColumn(); let c = false; let row3 = 1; // E1的行号固定为1,无需额外获取 const row1 = input1.getRow(); const col1 = input1.getColumn(); // 提前获取固定值,减少循环内API调用次数 const inputValue = input1.getValue(); const e = ws.getRange(row1, col1 - 3).getValue(); const k = ws.getRange(row1, col1 - 2).getValue(); while (!c && row3 < lastRow) { const b = ws.getRange(row3, col2).getValue(); const d = ws.getRange(row3, col2 - 3).getValue(); const g = ws.getRange(row3, col2 - 1).getValue(); const j = ws.getRange(row3, col2 - 2).getValue(); const targetCountry = "Spain"; // 实现原VBA不区分大小写的包含判断 const isMatch = inputValue.toLowerCase().includes(b.toLowerCase()) && e === d && j === k && g === targetCountry; if (isMatch) { c = true; return b; } else { row3++; c = false; } } // 无匹配时返回空字符串,与原VBA逻辑一致 return ""; }
额外优化说明
- 提前获取不变的单元格值(如
inputValue、e、k),避免循环内重复调用Google Sheets API,提升运行效率。 - 用
toLowerCase()+includes()实现原VBA中InStr(1, a, b, 1)的不区分大小写包含判断,逻辑完全等价。 - 明确变量命名(如
targetCountry替代h),提升代码可读性。
内容的提问来源于stack exchange,提问作者Armancik
相关产品推荐
相关产品推荐

