【问题标题】:2D array reading issue?二维数组读取问题?
【发布时间】:2015-09-10 22:56:48
【问题描述】:

我想创建一种“堆栈”,每次我删除一个项目时,工作表都会删除空白单元格。显然,我不能为此使用过滤器功能。

我无法读取为此目的创建的数组。

我的伪代码:我创建了一个空数组,获取所有值(包括空值),用除空值之外的所有值填充我的数组,最后清除堆栈并用我的数组设置值.

这是我的代码:

function updateStack() {
 
 var ss = SpreadsheetApp.getActive();
 var sheet = ss.getSheetByName("main");
  
 var zone = sheet.getRange(1, 1, 1, 10);
  
  //seems that .getValues() returns a 2d array

 var values = zone.getValues();
 var j = 0;
  
 var data = new Array();
  
  for (var i = 0 ; i < 10 ; i++) {

    //the problem seems to be here : I can't access the 2d array. After reading the debugging console about 1000 thousand times
    // I discovered the 2 pairs of []  
    
    //I've found multiple ways to detect empty cells. Not sure if this is the right one. I've tried the .length = 0 trick, but something
    // was wrong, maybe because of the "2dimensionality"

    
    if (values[i] != "") {
      
      data[j] = values[i];
      j = j++;
      
    } else {
      
      // do nothing if the cell contains nothing
     
    }
   
  //not sure if I have to use return ! Don't know where to put it exactly too...
  return data; 
  zone.clear();
    //length of range must be the same as the array's length
    
  zone = sheet.getRange(1, 1, 1, data.length);
  zone.setValues(data);
  }
}

我的代码中有很多cmets,希望你能理解。 我的测试表的链接:http://bit.ly/1JiWutn

感谢您的帮助!

【问题讨论】:

  • 直到您提到删除空白单元格的工作表之前我都明白了...您可能需要包含一些中间步骤/信息。
  • 感谢您指出这一点。我已经编辑过了,希望现在更清楚了。

标签: google-apps-script google-sheets google-apps-for-education


【解决方案1】:

目前,你有这样一段代码:

if (values[i] != "") {

  data[j] = values[i];
  j = j++;

} else {

您正在测试一个空字符串:

values[i] != ""

但是values[i] 是一个内部数组。您的代码只有一行 10 列。

var zone = sheet.getRange(1, 1, 1, 10);

所以,数组看起来像这样:

[ [cell one,cell two,cell three,etc,cell ten ] ]

values[i] 返回一个内部数组,而不是一个值。

要获取单元格值,请使用:

if (values[0][i] != "") {

您需要两个索引,第一个索引将始终为零。只有一个内部数组,其中包含所有单元格值。

接下来,使用pushdata 数组添加一个值:

data.push(values[0][i]);

另一个问题是你有return 语句。 return 语句会杀死当前函数。该函数内return 语句之后的任何内容都不会运行。因此,您不能在拥有它的地方拥有 return 语句,并获取将值写入电子表格的代码。你可以两者都做。您既可以将值写入工作表,也可以返回一些内容,但将返回放在最后。 return,返回一些东西给任何调用这个函数的函数。

要设置值,值必须是二维数组。您的 data 数组不是二维数组。您必须将data 数组添加到另一个数组。

var my2Darray = [];
my2Darray.push(data);

zone = sheet.getRange(1, 1, 1, data.length);
zone.setValues(my2Darray);

【讨论】:

  • 谢谢。我已经修改了代码,但它不起作用。我不确定双索引,因为调试控制台给了我 [["987sdf987", 987, 987, " ", 4654, 7, 987987, " ", "", ""]] 这让我想到:这是一个数组,里面有一个数组。所以,如果我想访问其中的一个项目,它将是 data[0][i]。
  • 哦,是的,我的错。对于那个很抱歉。我更新了我的答案。
  • 不客气,我很自豪我指出了这一点,这是我人生中的第一个剧本!还在为“退货”而烦恼:把它放在哪里?如果我省略它,表示不可能在对象中转换 Array,如果我放它,它会清除我的堆栈但不会写入我的值。
  • 查看更新的答案。如果需要,将 return 语句放在末尾。必须使用二维数组来设置值。
  • 我的大脑正在转换问题 - 我认为堆栈是行的选择 - 重新阅读它实际上是柱状的。我的错。
【解决方案2】:

如果您只测试整行中的空白单元格,那么您的测试几乎可以使用。如果您连接该数组中的所有值,则可以将结果与"" 进行比较。

// join all the values with nothing between them
// compare the result to empty string
if(values[i].join("") !== "") { 

  // if at least one cell contained something
  data.push(values[i]); // Stackius Popularious


}

【讨论】:

  • 我误读了这个问题 - 我假设范围是由行和列组成的二维范围 - 实际上它是只有列的单行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-13
  • 2019-08-08
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
相关资源
最近更新 更多