我正在创建一个脚本,允许您在删除完成的项目后合并待办事项列表。 我得到一个范围,使用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);
};
答案 0 :(得分:0)
您的编辑触发器不应该操作菜单。你应该有一个onOpen
触发器。如果你想要合并是自动的,那么你可以从你的onEdit开始。
在consolidatetodolist_()
函数中,您有一些关于值赋值,Javascript基础知识的错误。
valueInstance
的值不是必需的。你已经在rangeValues[i][0]
获得了它。注意这两个指标;存储在rangeValues中的数据是一个二维数组,即使您的范围是一列。第一个索引是行,第二个是列。 (来自A1Notation的命令相反。)if ( range.getLength(valueInstance) !== 0 )
应该崩溃,因为range
是Class 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循环就会适应而不会改变。var i
。你所做的事情没有错误(虽然没有分配值的声明是坏的),它对机器没有任何影响,但对于人类来说,在for循环中定义i
更清楚,除非你需要在循环之外使用它。 for (var i = 0; ...