Javascript 如何检查复选框是否已选中,并基于该复选框更改另一个单元格中的数据,重复多行
我试图创建一个脚本,每当被触发时,它都会遍历每一行,检查F列中的复选框是否被选中。如果是,则该行中A列的内容将替换为0。在运行代码时,不会发生任何事情。我不确定脚本在哪里被捕获,但我假设它在for()循环中。为了便于理解,我还附上了电子表格本身的图片。感谢您的帮助 我的代码:Javascript 如何检查复选框是否已选中,并基于该复选框更改另一个单元格中的数据,重复多行,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我试图创建一个脚本,每当被触发时,它都会遍历每一行,检查F列中的复选框是否被选中。如果是,则该行中A列的内容将替换为0。在运行代码时,不会发生任何事情。我不确定脚本在哪里被捕获,但我假设它在for()循环中。为了便于理解,我还附上了电子表格本身的图片。感谢您的帮助 我的代码: function onEditButAgain(event){ var sheet = SpreadsheetApp.getActiveSpreadsheet(); var editedCell = sheet.g
function onEditButAgain(event){
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var editedCell = sheet.getActiveCell();
var columnToSortBy = 6;
if(editedCell.getColumn() == columnToSortBy)
{
for(var x = 2; x<=100; x++)
{
var checked = sheet.getRange(x, 6);
if(checked.isChecked == true)
{
var date = sheet.getRange(x, 1);
date.setValue("0");
}
}
}
}
函数oneditbutreach(事件){
var sheet=SpreadsheetApp.getActiveSpreadsheet();
var editedCell=sheet.getActiveCell();
var columnToSortBy=6;
if(editedCell.getColumn()==ColumntToSortby)
{
对于(变量x=2;x解释:
您的目标是手动执行一个脚本,每当选中F列中同一行的单元格时,该脚本将更改a列中的值
- 代码中的明显问题是
isChecked
,它应该是isChecked()
。当您想要执行一个函数时,使用括号,在这种情况下,您想要执行isChecked
- 在这种情况下,
onEdit
脚本将是多余的。如果要使用名为oneditbutreach
的onEdit
触发器,则必须创建触发器。但不需要为此目的安装触发器
- 虽然您可以将此答案中的以下代码封装在一个简单的
onEdit()
函数中,但不使用事件对象,代码的效率也不会达到100%。但是如果您想手动运行它,您不需要触发器
- 当您使用循环时,使用诸如
getRange
或isChecked
或setValue
之类的方法不是一个好的做法,因为这些方法的计算成本很高,而且脚本速度很慢。请改为使用数组和getValues
/setValues
解决方案:
说明:
您的目标是手动执行一个脚本,每当选中F列中同一行的单元格时,该脚本将更改a列中的值
- 代码中的明显问题是
isChecked
,它应该是isChecked()
。当您想要执行一个函数时,使用括号,在这种情况下,您想要执行isChecked
- 在这种情况下,
onEdit
脚本将是多余的。如果要使用名为oneditbutreach
的onEdit
触发器,则必须创建触发器。但不需要为此目的安装触发器
- 虽然您可以将此答案中的以下代码封装在一个简单的
onEdit()
函数中,但不使用事件对象,代码的效率也不会达到100%。但是如果您想手动运行它,您不需要触发器
- 当您使用循环时,使用诸如
getRange
或isChecked
或setValue
之类的方法不是一个好的做法,因为这些方法的计算成本很高,而且脚本速度很慢。请改为使用数组和getValues
/setValues
解决方案:
感谢您的帮助!但是,当我运行此程序时,我收到一条错误消息“TypeError:无法读取null的属性'getRange'。我想这是因为此范围的底部有一些空行。我该如何解决此问题?(我不想每次添加新行时都要更新范围,因为我会经常这样做。)ZhediKnight错误的原因是你没有改变代码中的<代码> SHIET1 部分,就像我在代码中评论的那样。用你的表的名字替换<代码> SHIET1 。关于你提到的另一个主题。我更新代码要考虑到最后一行。如果这不起作用的话。厄利(因为你有其他值低于A和F列范围,那么你必须与我共享你的表的副本。当你看到实际的纸张时,找到一个解决方案会更快得多。”ZediWalter我更新了你的文件中的代码。转到脚本编辑器,执行<代码> MyFuffy。@ ZediKnter,如果它对你有用,请考虑接受。通过单击答案左侧的勾选按钮来编辑答案。谢谢,我这样做了,但由于我是堆栈溢出新手,因此无法直观地更新它:/对不起!谢谢帮助!但是,当我运行此操作时,我收到一条错误消息“TypeError:无法读取null的属性'getRange'我想这是因为在这个范围的底部有一些空行。我该如何解决这个问题?(我不想每次添加新行时都要更新这个范围,因为我会经常这样做。)ZhediKnight错误的原因是你没有改变代码中的<代码> SHIET1 部分,就像我在代码中评论的那样。用你的表的名字替换<代码> SHIET1 。关于你提到的另一个主题。我更新代码要考虑到最后一行。如果这不起作用的话。厄利(因为你有其他值低于A和F列范围,那么你必须与我共享你的表的副本。当你看到实际的纸张时,找到一个解决方案会更快得多。”ZediWalter我更新了你的文件中的代码。转到脚本编辑器,执行<代码> MyFuffy。@ ZediKnter,如果它对你有用,请考虑接受。通过单击答案左侧的勾选按钮来编辑答案。谢谢,我这样做了,但由于我是堆栈溢出新手,因此无法直观地更新它:/sorry!
function myFunction(){
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Sheet1'); // change it to your sheet name
const valA = sh.getRange('A2:A'+sh.getLastRow()).getValues().flat();
const cb = sh.getRange('F2:F'+sh.getLastRow()).getValues().flat();
const new_valA = cb.map((c,i)=> [c ? "0" : valA[i]]);
sh.getRange(2,1,new_valA.length,new_valA[0].length).setValues(new_valA);
}