【问题标题】:Google Sheets: Comparing Columns with CheckboxesGoogle 表格:将列与复选框进行比较
【发布时间】:2020-11-14 21:49:04
【问题描述】:

我正在尝试创建一个待办事项列表电子表格。在一个专栏中,"Daily Tasks",我有一个任务列表。在另一列中,我有复选框。我的目标是创建一个脚本,将所有“已检查”任务添加到数组中。

我正在尝试使用嵌套的 for 循环在我的脚本中执行此操作。但是,当我记录应该包含检查项 (trueArr) 的新数组时,我只看到一系列看似空的数组。

如何更改我的脚本以使我的数组包含电子表格中选中的项目?

Here is a link to my spreadsheet

这是我的代码:

//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);
    }
}

在我的日志中,我希望在电子表格的“每日任务”列表中看到相同的项目,但我只看到空数组。

【问题讨论】:

    标签: javascript arrays google-apps-script google-sheets


    【解决方案1】:

    说明/问题:

    除了以下两点之外,你们很亲近:

    • checks 数组是一个二维数组,因为您使用 getValues() 创建它。这意味着checks[j] 是一个 row 或者换句话说是一个一维数组。将数组与值进行比较是根本错误的。相反,您应该在if 语句中使用checks[j][0],因为这将遍历单个列的每个值。另一种方法是使用flat 将二维数组转换为一维,然后使用您当前的代码。

    • 第二个问题与您不会在任何地方使用的 for 循环有关。您的代码迭代了i,但您在代码中不使用或不需要i。还要记住taskschecks 具有相同的行数(相同的长度),因此在这种情况下一个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] 也是一个行或一维数组。这就是为什么你最终会得到一个一维数组的集合。

    【讨论】:

    • 非常感谢!您的编辑/解释非常有帮助。
    【解决方案2】:

    我找到了一种使用过滤器方法和箭头函数创建相同选中项数组的方法。制作了一个包含复选框和列表项的二维数组。然后我按第一列中的复选框进行过滤。无需循环!

    //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);
    
    }

    用一小部分代码得到相同的结果!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-17
      • 2015-11-02
      • 2023-01-26
      • 1970-01-01
      • 2016-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多