onEdit() 使用复选框时出现“行未定义”错误

问题描述 投票:0回答:1

如果 B-D 列已填充或未填充,此脚本会尝试在 A 列中添加或删除复选框。如果该行的这三列中的每个单元格都已填充,则在 A 列中插入一个复选框。如果该行的这三列中的一个单元格未填充,则不会插入复选框。

A 列 = 复选框

B 栏 = 标题

C 列 = tstart

D 列 = tstop

function refreshCheckboxes(){
  let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet_name');
  var rows = sheet.getDataRange().getValues();
  var headers = rows.shift();
  var checkbox = row[0]
  var title = row[1];
  var tstart = row[2];
  var tstop = row[3];
  for (var i = 0; i < rows.length; i++) {  
    if (rows[[title][tstart][tstop]] !== "") {  
      checkbox.insertCheckboxes();
    } else {
      checkbox.clearDataValidations();
      checkbox.clearContent();
    }
  }
}

当前结果:

设置行变量时发生

ReferenceError:行未定义。我不确定为什么会收到该错误,因为我有类似的函数以这种方式定义行变量。我对该脚本的另一个担心是如何设置 B-D 列。数组在这里合适吗?有没有更好的方法来设置它?

期望的结果:

确定导致行定义错误的原因并进行更正。验证 AND() 功能是否有效。

我已经有一个 onEdit() ,它工作得很好,除了一次只适用于一行,因此我想自定义一个以根据需要运行。

谢谢!

google-apps-script checkbox undefined
1个回答
0
投票

我相信您的目标如下。

  • 您想要在“B”到“D”所有列都有值时插入复选框。
  • 当“B”到“D”列之一没有值时,您想要删除复选框。
  • 您想知道
    ReferenceError: row is not defined
    问题的原因。

修改要点:

  • 在您的显示脚本中,
    row
    未定义。这就是错误的原因。这已经在评论中提到过。即使解决了这个问题,我认为不幸的是,
    rows[[title][tstart][tstop]]
    无法使用。

从这种情况来看,如何修改你的脚本如下?

修改后的脚本:

请设置您的工作表名称。

function refreshCheckboxes() {
  let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheet_name');

  // --- I modified the below script.
  // Retrieve values from "B2:D".
  var rows = sheet.getRange("B2:D" + (sheet.getLastRow() || 1)).getDisplayValues();
  
  // Create 2 range lists for inserting and removing the checkboxes.
  var { insert, remove } = rows.reduce((o, r, i) => {
    if (r.includes("")) {
      o.remove.push(`A${i + 2}`);
    } else {
      o.insert.push(`A${i + 2}`);
    }
    return o;
  }, { insert: [], remove: [] });

  // Insert checkboxes.
  if (insert.length > 0) {
    sheet.getRangeList(insert).insertCheckboxes();
  }

  // Remove checkboxes.
  if (remove.length > 0) {
    sheet.getRangeList(remove).removeCheckboxes();
  }
}

在此脚本中,当“B”到“D”所有列都有值时,复选框将插入到“A”列中。当“B”到“D”列之一没有值时,“A”列的复选框将被删除。

参考资料:

© www.soinside.com 2019 - 2024. All rights reserved.