【问题标题】:How do you resolve a "The parameters (number[]) don't match the method signature for SpreadsheetApp.Range.setValues" error如何解决“参数(数字 [])与 SpreadsheetApp.Range.setValues 的方法签名不匹配”错误
【发布时间】:2020-04-09 07:18:38
【问题描述】:

我收到此错误:

“参数 (number[]) 与 SpreadsheetApp.Range.setValues 的方法签名不匹配。”

当我尝试将一组值写入工作表时,在我的 Google Apps 脚本中。

以下是代码的缩短(简化)版本。实际代码运行大约 10,000 条记录。

在最后一行调用setValues 时产生错误。

我知道我在这里遗漏了一些超级简单的东西。

function writeArrayToSheet() {

  var ss = SpreadsheetApp.openById("Spreadsheet_ID");
  var orderSheet = ss.getSheetByName("Sheet_Name");
  var vTable = orderSheet.getRange(1,6,5,11).getValues(); //Raw data 
  var vWriteTable = []; //Data that will be written to sheet
  var updateTime = new Date();
  var i = 0;
  var vSeconds = 0;


  while (i < 5 && vTable[i][0] != "") {

    //Logic section that calculated the number of seconds between

    if (vSeconds == 0) {
      vWriteTable.push("");
    } else {
      if (vTable[i][6] < certain logic) {
        vWriteTable.push("Yes");
      } else {
        vWriteTable.push("");
      }      
    }        
    i = i + 1;
  } // End while

  orderSheet.getRange(1,20,vWriteTable.length,1).setValues(vWriteTable);
} //End Function

这是vWriteTable在调试时的样子:

【问题讨论】:

    标签: arrays google-apps-script google-sheets


    【解决方案1】:

    setValues 接受(并且getValues() 返回):

    • 1 个参数类型:
    • Object[][] 二维对象数组

    它确实接受一维数组。范围始终是二维的,无论范围的高度或宽度或两者如何

    如果 A1:A2 是范围,那么对应的值数组将是:

    • [[1],[3]]

    同样,A1:B1 会是

    • [[1,2]]

    A1:B2 是

    • [[1,2],[3,4]]

    请注意二维如何提供方向,并且它始终是一个二维数组,即使范围的高度或宽度仅为 1。

    解决办法:

    推入一维数组,使输出数组为二维。

    片段:

    vWriteTable.push([""]);
    

    更多信息:

    有关谷歌表格中数组的更详细说明,请查看我的答案here

    【讨论】:

    • 有人可以编辑这个答案以提供实际的解决方案吗?我不知道如何处理 sn-p。
    • @user8118328 sn-p 的意思是每次推送时都必须是二维数组。因此,如果您正在构建的数组是 1D 的,则需要添加额外的方括号以使其成为 2D。当应用于原始问题时,这意味着您将以下代码行替换如下: vWriteTable.push(""); --> vWriteTable.push([""]);和 vWriteTable.push("是"); --> vWriteTable.push(["Yes"]);
    • 对于动态值=>var yourVariable=; =>vWriteTable.push([yourVariable]); (而不仅仅是 vWriteTable.push(yourVariable); )
    【解决方案2】:

    getValues 返回对象[行][列]

    1 行对象 [[1...n]] - 这可能会使 b/c 混淆它可能看起来不像 2D,但它是 2D 对象[1 行][n 列]

    2 行对象 [[1...n],[1...n]] - 对象[2 行][n 列]

    等 [[1...n],...,[1...n]] - 等

    如果您需要将值设置为具有 n 行和 m 列的矩形范围,请创建 EXACTLY n x m 数组 1st,然后用您的值填充它并将其发送到电子表格中的 MATCHING 范围。这是我的一些代码可能会有所帮助。

    从第 n 行的第 1 m 个单元格中获取值并将它们推送到简单的一维数组中:

        var arr = [];         
        var dataRow = sheet.getRange(n,1,1,m).getValues();
        for (var j=0; j<dataRow.length; j++){
          arr.push(dataRow[0][j]);
        }
    

    用一维数组 arr 中的新值替换它们:

    //create 2D array with just 1 row and m columns
        var dataRow = new Array(1);
        dataRow[0] = new Array(arr.length);
    //fill it with values
        for(var j=0;j<arr.length;j++){
            dataRow[0][j]=arr[j];
        }
    //send it to the spreadsheet
        sheet.getRange(n,1,1,arr.length).setValues(dataRow);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多