【问题标题】:From Array to setValues gives: "Cannot convert to ."从 Array 到 setValues 给出:“无法转换为。”
【发布时间】:2012-06-19 03:51:45
【问题描述】:

背景。我想从一周格式更改时间表(每行显示 7 天,没有日期仅来自 yyww 中的一周(例如 1225)。在另一张表中,一列列出周,另一列列出日期。

方法。我将这两张表放入两个数组中,将第三个数组中的值打包到第三张表中。

问题。此行给出错误消息:“无法转换为。”

  sheet_IndataTabell.getRange(1,1,IndataTable.length+1,7).setValues(IndataTable);

来源。 您可以在下面查看文档here 和完整功能:

function UpdateTable() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet_Indata = ss.getSheetByName("Indata");
var sheet_IndataTabell = ss.getSheetByName("Indata_Tabell");
var sheet_Calendar = ss.getSheetByName("Kalender");

//Get the table into arrays
var Indata = sheet_Indata.getDataRange();
var CalendarTable = sheet_Calendar.getDataRange();

//Gets the values in the Indata to an Array
var NumberRows = Indata.getLastRow();
var NumberCols = Indata.getLastColumn();
//Browser.msgBox(NumberRows + " " + NumberCols);
var IndataArray = new Array(NumberRows,NumberCols);
var IndataArray = Indata.getValues();

//Create an Array to store the result
var IndataTable = new Array(((NumberCols-1)*(NumberRows-1)),7);
//Browser.msgBox("First the IndataTable is defined as: (NumberCols-1)*(NumberRows-1) (" + (NumberCols-1)*(NumberRows-1) + ").");

//Gets the values in the Calendar to an Array
var NumberRows_Cal = CalendarTable.getLastRow();
var NumberCols_Cal = CalendarTable.getLastColumn();
//Browser.msgBox(NumberRows + " " + NumberCols);
var CalendarArray = new Array(NumberRows_Cal,NumberCols_Cal);
var CalendarArray = CalendarTable.getValues();

for (i=1; i<(IndataArray.length); i++)
{

  for (j=3; j<10; j++) {

  IndataTable[i*7+j-3-7] = {};

  //adds the users
  IndataTable[i*7+j-3-7][0] = IndataArray[i][1];

  //adds the week numbers
  var Vecka = IndataArray[i][2];
  IndataTable[i*7+j-3-7][1] = Vecka;

  //adds the hours
  IndataTable[i*7+j-3-7][2] = IndataArray[i][j];

  //adds the projects
  IndataTable[i*7+j-3-7][3] = IndataArray[i][10];

  //adds the day
  var Dag = (j-2);
  IndataTable[i*7+j-3-7][4] = Dag;

  //Gets the date from the Calendar
  IndataTable[i*7+j-3-7][5] = "=VLOOKUP(G" + (i*7+j-9) + ";Kalender!$B$1:C;2)+E" + (i*7+j-9) + "-1";

  IndataTable[i*7+j-3-7][6] = Vecka+"_"+Dag;

  //Browser.msgBox("[" + (i*7+j-3-7) + "][n]: " + IndataTable[i*7+j-3-7][0] + ", " + IndataTable[i*7+j-3-7][1] + ", " + IndataTable[i*7+j-3-7][2] + ", " + IndataTable[i*7+j-3-7][3] + ", " + IndataTable[i*7+j-3-7][4] + ", " + IndataTable[i*7+j-3-7][5] + ", " + IndataTable[i*7+j-3-7][6]);

  }

}


sheet_IndataTabell.clear();
//Browser.msgBox("IndataTable.length: " + IndataTable.length);
//Browser.msgBox("IndataTable[0].length: " + IndataTable[0].length);
//Browser.msgBox("Last row on Range: " + sheet_IndataTabell.getRange(1, 1, IndataTable.length,7).getLastRow());
//Browser.msgBox(IndataTable);

sheet_IndataTabell.getRange("A1:G28").setValues(IndataTable);

//sheet_Indata.sort(3,true); 

//Browser.msgBox("Uppdatering klar!");
sheet_IndataTabell.getRange("J1").setValue(Date());

}

【问题讨论】:

  • 这是一个非常古老的问题,但我也遇到了同样的问题。 user1460248 说:“这行得通,但最好能理解为什么第一个数组的格式错误。”我发现一个空值已经潜入我的数组,例如:[ ['2018-07-12', ['LUNCH'], 1.0], null, ['2018-07-13', 'Inbox, planning', 0.5] ] Google Apps 脚本抛出“无法将数组转换为 Object[][]。”因为空值。

标签: multidimensional-array google-apps-script setvalue


【解决方案1】:

setValues()getValues() 总是使用二维数组,即使范围只有 1 行高,所以你应该使用:

LINE 212     sheet_IndataTabell.getRange(1, 1, 1, 2).setValues([IndataTable_Temp]) 

(注意我添加的那对括号。)

另外,即使没有问题,在使用Range.getValues()之前也不需要定义数组的大小,只需去掉你作为参数输入的(NumberRows_Cal,NumberCols_Cal)

var CalendarArray = new Array() 

足够了。

编辑:关于您的评论:请在您的代码中的第 225 行添加这两个 Logger.log,当您获得 2 个数组时,其中一个在 setValues() 中不可用,您会看到发生了什么:

    Logger.log(IndataTable);//this one contains JS objects between {}
    Logger.log(IndataTable_Temp);// this one contains array elements between [[]] 
  //Writes the array content to the sheet
  sheet_IndataTabell.getRange(1, 1, i, 11).setValues(IndataTable_Temp);

EDIT2:我对脚本末尾做了一个小改动,现在数据是纯字符串,数组是真正的 2D(再看括号):

  //Reconstruction the Array, I do not know why this is needed
  var IndataTable_Temp = new Array();
  for (i=0; i<IndataTable.length; i++) {
//  Logger.log(typeof(IndataTable[i][0]))
    IndataTable_Temp.push([
      IndataTable[i][0],
      IndataTable[i][1],
      IndataTable[i][2],
      IndataTable[i][3],
      IndataTable[i][4],
      IndataTable[i][5],
      IndataTable[i][6],
      IndataTable[i][7],
      IndataTable[i][8],
      IndataTable[i][9],
      IndataTable[i][10]
    ]);
  }
    Logger.log(IndataTable)
    Logger.log(IndataTable_Temp)
  //Writes the array content to the sheet
  sheet_IndataTabell.getRange(1, 1, IndataTable_Temp.length, IndataTable_Temp[0].length).setValues(IndataTable_Temp);

  //Sets timestamp
  sheet_IndataTabell.getRange("L1").setValue(Date());

【讨论】:

  • 谢谢你的回答,谢尔盖。我试过了,但它没有用。该数组已经是一个二维数组(我猜),但有些格式错误。我最终做的是遍历数组并使用格式 [[a,b,c],[d,e,f]] 创建一个新数组。这行得通,但很高兴理解为什么第一个数组的格式错误。附言。是的,我现在做了一些简化:)这是我的第一个脚本;)
  • 您的在线副本是否与新脚本保持同步?
  • 另外:不要犹豫,使用 Logger.log(variable name) 来查看例如数组是 1D 还是 2D .... 非常有用 ;-)
  • 谢谢谢尔盖。 Logger.log() 确实使调试变得更容易!是的,在线副本是正在开发的(即将生产)。您能解释一下 IndataTable JS 对象的原因吗?
  • 你的代码有点长而且复杂(瑞典语的部分真的很难;-)但是通过将日志放在不同的点上可以让我们看看会发生什么。查看我第一次编辑中的 2 条日志:[{3=Hos kund, 2=0.0, 10=0.0, 1=1105.0... 每次的形式都是 'index=value'。
【解决方案2】:

虽然这是一个旧线程,但我的回答可以帮助其他人在这里解决这个问题,

基本上,这个函数循环遍历一个数组并检查是否有一个空槽,然后从前一个槽中获取值并向其中添加文本。

function addText(){
  var ss = SpreadsheetApp.getActiveSpreadsheet(); //Getting active spreadsheet
  var s = ss.getActiveSheet();  //Getting active sheet

  var sheetName = s.getSheetName(); //Getting active sheet name
  var lastRow = s.getLastRow(); //Getting sheets last row number

  if (sheetName == "sheetName") { //Checking if active sheet is that we want to be
  var jobValuesRange = s.getRange("C8:C" + lastRow); //Getting range that is only one column
  var jobValues = jobValuesRange.getValues(); //Getting values from only one column

    for (var i = 0; i < jobValues.length + 1; i++) { //Looping through all array values
     if (jobValues[i] == "") { 
       //Here is MAGIC where you must add brackets to create two dimension array.
       //Array should be like with lot of rows like first dimension and second dimension,
       //like one cell in that row. 
       jobValues[i] = [jobValues[i - 1] + " night"]; 
     }
    }
    jobValuesRange.setValues(jobValues); // Here you are just updating old values to new values
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    相关资源
    最近更新 更多