Google App脚本 - setValues()不起作用

时间:2014-09-24 11:08:34

标签: google-apps-script

所以,我尝试使用onEdit()事件编写一个脚本,它基本上会删除重复的链接(从技术上讲,它会删除所有内容,并且只会放回不重复的内容) 。

我的代码一直很好,直到它回写非重复的时间。即,我使用range.setValues()的行。我知道它需要一组要编辑的单元格数组,并且所述数组需要适合该范围。

到目前为止,我有:

      if (unique)
  {
    newData.push(editedRow[0]);
    Browser.msgBox(newData); 
  }

Unique是我使用的变量,如果找到了确切的条目,则为false。使用msgBox命令,我可以验证newData是否包含它需要包含的内容。再往下,我有:

newDataFinal = [newData];
Browser.msgBox('Put values '+newDataFinal+' in range ' +range.getA1Notation());
range.setValues(newDataFinal);

据我所知,这应该使NewDataFinal成为一个数组数组,我可以验证是否将setValues()更改为setValue(),它在电子表格中写[[22.0,13.0,23.0]](对于我的例子) ,对我来说,它看起来像一个数组。

范围也应该匹配,因为在这个例子中,我得到了一个提示,即"将值22,13,23放在范围B2:B4"来自msgBox,这似乎是一个合适的范围。 那么,我做错了什么?

这里是剩下的代码(请原谅评论/ msgboxes的丰富性和缺乏优雅,优先考虑是让它发挥作用,我可以优化它并在之后清理一堆):

function onEdit(e)
{
  var range = e.range;
  var values = range.getValues();                      
  var sheet = SpreadsheetApp.getActiveSheet();
  if (sheet.getName() != 'testiranje') return;
  newData = new Array();
//  Browser.msgBox(range.getA1Notation()); 
  range.clear();
  var data = sheet.getDataRange().getValues();
  var counter = 0;
  for (editedRowIndex in values)
  {
    unique = true;
    editedRow = values[editedRowIndex];
//    Browser.msgBox('Edited Row ' +editedRow);
    for(i in data)
    {
      var row = data[i];
 //     Browser.msgBox('Old Row '+row);
      for (j in row)
      {
  //      Browser.msgBox(row[j] + ' vs ' + editedRow[0])
        if (editedRow[0] == row[j])
        {
          Browser.msgBox('Hit! '+editedRow[0]);
          unique = false; 
        }
      }
    }
      if (unique)
      {
     //   Browser.msgBox('Pushing '+editedRow[0]+' in newdata');
        newData.push(editedRow[0]);
        Browser.msgBox(newData);
      }
  }
  newDataFinal = [newData];
  Browser.msgBox('Put values '+newDataFinal+' in range ' +range.getA1Notation());
  range.setValues(newDataFinal);


 // range.setNote('SCIENCE');
 }

2 个答案:

答案 0 :(得分:0)

我没有测试您的代码,因为我不想为它创建工作表,但我可以建议(无论如何应该解决此问题)是替换您的range.setValues(newDataFinal);有了这个:

sheet.getRange(range.getRowIndex(),range.getColumnIndex(),newDataFinal.length,newDataFinal[0].length).setValues(newDataFinal);

如果您想知道为什么范围和数组不合适,您可以使用此代码:

(我使用浏览器,因为你似乎喜欢它......我更喜欢Logger.log)

Browser.msgBox('data height = '+newDataFinal.length+', data width = '+newDataFinal[0].length+' and range height is '+range.getHeight()+', range width is '+range.getWidth()+' ... does it fit ?');

注意:我几乎可以肯定你的初始范围比newData数组要大,因为你从初始数据中删除了元素......我最好的猜测就是那些高度不会超过&#39适合。 (但这只是猜测;-)因为你没有提到你得到的错误信息......)

答案 1 :(得分:0)

问题是您无法更改onEdit处理程序中的单元格。看文档。而是安装自己的onEditCustom处理程序。