Javascript 如何检查复选框是否已选中,并基于该复选框更改另一个单元格中的数据,重复多行

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

我试图创建一个脚本,每当被触发时,它都会遍历每一行,检查F列中的复选框是否被选中。如果是,则该行中A列的内容将替换为0。在运行代码时,不会发生任何事情。我不确定脚本在哪里被捕获,但我假设它在for()循环中。为了便于理解,我还附上了电子表格本身的图片。感谢您的帮助

我的代码:

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