如果 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() ,它工作得很好,除了一次只适用于一行,因此我想自定义一个以根据需要运行。
谢谢!
我相信您的目标如下。
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”列的复选框将被删除。