[英]Google Sheets: Comparing Columns with Checkboxes
我正在尝试创建一个待办事项列表电子表格。 在"Daily Tasks"
一栏中,我有一个任务列表。 在另一列中,我有复选框。 我的目标是创建一个脚本,将所有“已检查”任务添加到数组中。
我正在尝试使用嵌套的 for 循环在我的脚本中执行此操作。 但是,当我记录应包含已检查项 (trueArr) 的新数组时,我只看到一系列看似空数组的内容。
如何更改我的脚本,以便我的数组包含电子表格中选中的项目?
这是我的代码:
//spreadsheet var ss = SpreadsheetApp.getActiveSpreadsheet(); //worksheet var todoList = ss.getSheetByName("To-Do List"); function completedArray(){ var tasks = todoList.getRange("c6:d22").getValues(); var checks = todoList.getRange("b6:b22").getValues(); var trueArr = []; for(var i =0; i <tasks.length; i++){ for(var j=0; j<checks.length;j++){ if(checks[j]===true){ trueArr.push(tasks[j]) } } Logger.log(trueArr); } }
在我的日志中,我希望在电子表格的“日常任务”列表中看到相同的项目,但我只看到空数组。
除了以下两件事外,您非常接近:
checks
数组是一个二维数组,因为您使用getValues()来创建它。 这意味着checks[j]
是一行,或者换句话说,是一个一维数组。 将数组与值进行比较从根本上是错误的。 相反,您应该在if
语句中使用checks[j][0]
,因为这将遍历单列的每个值。 另一种方法是使用flat将 2D 数组转换为 1D,然后使用您当前的代码。
第二个问题与你不在任何地方使用的for
循环有关。 您的代码迭代i
但您在代码中不使用或不需要i
。 还要记住, tasks
和checks
具有相同的行数(相同的长度),因此在这种情况下一个for
循环就足够了。
//spreadsheet
var ss = SpreadsheetApp.getActiveSpreadsheet();
//worksheet
var todoList = ss.getSheetByName("To-Do List");
function completedArray(){
var tasks = todoList.getRange("c6:d22").getValues();
var checks = todoList.getRange("b6:b22").getValues();
var trueArr = [];
for(var j=0; j<checks.length;j++){
if(checks[j][0]===true){
trueArr.push(tasks[j])
}
}
Logger.log(trueArr);
}
trueArr
的结构将是: [[task2, task2], [task3, task3], [task9, task9]]
因为tasks[j]
也是一个行或一维数组。 这就是为什么你最终会得到一维数组的集合。
我找到了一种使用过滤器方法和箭头函数创建相同检查项数组的方法。 制作了一个包含复选框和列表项的二维数组。 然后我通过第一列中的复选框进行过滤。 不需要循环!
//spreadsheet var ss = SpreadsheetApp.getActiveSpreadsheet(); //worksheet var todoList = ss.getSheetByName("To-Do List"); var dailies = todoList.getRange("b6:e22").getValues(); function checkedItems(){ var checkedItems = dailies.filter(row => row[0] === true); Logger.log(checkedItems); }
用一小部分代码得到了相同的结果!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.