You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

错误原因与修正方案

核心错误点

  1. 方法调用缺失括号:getRow、getColumn、getA1Notation都是方法,必须加括号调用(如input1.getRow()),否则会被当作属性引用,导致"不是函数"的错误。
  2. 错误获取单元格内容:用getA1Notation()获取的是单元格地址(如E5),而非单元格内的值,应该用getValue()获取内容,这也是getRange参数报错的间接原因。
  3. 工作表作用域不明确:原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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 18:24:50