Google Spreadsheets用数据减去空单元格替换单元格范围

时间:2014-07-18 22:17:50

标签: google-app-engine google-apps-script google-sheets

我正在创建一个脚本,允许您在删除完成的项目后合并待办事项列表。 我得到一个范围,使用if语句将指定范围内的所有非零单元格值推送到数组,清除单元格范围,然后将新数组(减去没有数据的单元格)重新粘贴到相同的范围内范围。这是我的代码:(感谢mogsdad!)

function onOpen()
{
  var spreadsheet = SpreadsheetApp.getActive();
  var menuItems = [
    {name: 'Consolidate To-Do list', functionName: 'consolidatetodolist_'}
  ];
  spreadsheet.addMenu('LB functions', menuItems);
};


function consolidatetodolist_()
{
  var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getSheets()[0];
  var range = sheet.getRange("A2:A19");
  var rangeValues = range.getValues();
  var todosArray = new Array(); 
  for (var i = 0 ; i < rangeValues.length ; i++ ) { 
      var row = rangeValues[i];
      var cell = row [0];
      if (null !== cell && "" !== cell)  {
      todosArray.push(row);
      };
  };

  Logger.log(todosArray);
  range.clearContent();
  range.offset(0,0,todosArray.length).setValues(todosArray);    

    };

1 个答案:

答案 0 :(得分:0)

您的编辑触发器不应该操作菜单。你应该有一个onOpen触发器。如果你想要合并是自动的,那么你可以从你的onEdit开始。

consolidatetodolist_()函数中,您有一些关于值赋值,Javascript基础知识的错误。

  • 使用SpreadsheetApp服务获取valueInstance的值不是必需的。你已经在rangeValues[i][0]获得了它。注意这两个指标;存储在rangeValues中的数据是一个二维数组,即使您的范围是一列。第一个索引是,第二个是。 (来自A1Notation的命令相反。)
  • if ( range.getLength(valueInstance) !== 0 )应该崩溃,因为rangeClass Range的实例,没有getLength()方法。您要检查的是当前单元格是否为空白。由于电子表格数据可以是三种javascript类型(字符串,数字,日期),因此您需要进行可以处理其中任何一种的比较,以及一个null的空单元格。试试if (null !== cell && "" !== cell)...
  • 当您到达setValues时,您需要提供与range尺寸相同的二维数组。首先,您需要确保todosArray是一个数组数组(行数组,其中一行是一个单元格数组)。最简单的方法是使用var row = rangeValues[i]; var cell = row[0];,然后使用todosArray.push(row);。由于您首先清除原始范围,因此可以使用offset(0,0,todosArray.length).setValues(todosArray)定义相对于它的新范围。

其他挑剔:

  • 您已经有了使用有意义的变量名称的想法,很好。但是valueInstance代替cell,会使此代码更清晰。
  • 应避免使用“幻数”,因为它使得理解,维护和重用代码变得更加困难。例如,您可以使用i < 18而不是i < rangeValues .length。这样,如果你修改了合并范围的大小,for循环就会适应而不会改变。
  • 在for循环之外声明var i。你所做的事情没有错误(虽然没有分配值的声明是坏的),它对机器没有任何影响,但对于人类来说,在for循环中定义i更清楚,除非你需要在循环之外使用它。 for (var i = 0; ...