【问题标题】:If Checkbox is checked, use a script to clear specified cells in row and clear checkbox after script is run如果选中复选框,则使用脚本清除行中的指定单元格并在脚本运行后清除复选框
【发布时间】:2019-05-08 05:09:02
【问题描述】:

我正在尝试获取一个复选框以在它所在的行上运行脚本。它需要遍历指定工作表中的所有行。

如果在 F 列中选中了一个复选框,我想安排一个脚本来清除 B-F 列。

B 是一个复选框,应该设置为 FALSE C 是经过数据验证的输入 D 是数据验证输入 E 是一个公式,它依赖于 C 和 D 中的数据。公式应该保留。

F 为 true 是触发复选框

如果勾选了F,则清除B、C、D、F中的内容(E是公式,不应该清除)

我尝试从此处和其他链接修改脚本但没有成功:

Reset checkboxes to false

Using a script to generate docs from rows in Google Sheet if checkbox is checked

Google Sheets Script to Hide Row if Checkbox Checked


 function try_It(){
 deleteRow(5); //// choose col = 2 for column C, 5 for F
 }

 function deleteRowContents (col){ // col is the index of the column to check for checkbox being true

 var sh = SpreadsheetApp.getActiveSheet();
 var data = sh.getDataRange().getValues();
 var targetData = new Array();
 for(n=0;n<data.length;++n){
 if(data[n][col]!="TRUE" && data[n][col]!="FALSE"){ targetData.push(data[n])};
 }
 Logger.log(targetData);
 sh.getDataRange().clear();
 sh.getRange(1,1,targetData.length,targetData[0].length).setValues(targetData);
 }

预期结果: 如果选中 F 列,请清除同一行中的 B:F。(我知道上面的这个脚本甚至还没有完成)。

实际结果: 这将删除整个工作表上的所有格式。 即使在 F 列复选框中,它也无法正确清除范围。

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:
    • 当“F”列的复选框为true 时,您想清除“B”到“D”列和“F”列的值。
      • 在这种情况下,您希望将复选框更改为false
    • 您不想清除单元格格式。

    如果我的理解是正确的,那么这个修改呢?请将此视为几种解决方案之一。修改后的脚本流程如下。

    • 创建用于从检索到的值中删除列的范围列表。
    • 清除范围列表的内容。

    修改脚本:

    function deleteRowContents (col){ // col is the index of the column to check for checkbox being true
      var col = 6; // If the column "F" is 6, please set 6.
      var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet4"); // Modified
      var data = sh.getDataRange().getValues();
    
      // Below script was modified.
      var deleteRanges = data.reduce(function(ar, e, i) {
        if (e[col - 1] === true) { // Modified
          return ar.concat(["B" + (i + 1) + ":D" + (i + 1), "F" + (i + 1)]);
        }
        return ar;
      }, []);
      if (deleteRanges.length > 0) { // or if (deleteRanges.length) { // Added
        sh.getRangeList(deleteRanges).clearContent();
      }
    }
    

    参考资料:

    如果我误解了您的问题并且这不是您想要的结果,我深表歉意。

    【讨论】:

    • 谢谢!这真太了不起了。非常有帮助,超出了我的技能水平。我现在唯一的问题是 - 如果没有检查任何内容,如果给出错误。 “范围必须至少有一个范围。” 指向“deleteRanges” 如果 deleteRanges 为空,我该如何使其不引发错误?
    • @B D 感谢您的回复。我带来的不便表示歉意。我更新了我的答案。你能确认一下吗?
    • 谢谢!!这主要是完美无缺的。唯一奇怪的是,它从第 6 行删除了根本没有复选框的标题。这是检查复选框的哪一部分?
    • 另一个问题 - 我如何使它只适用于 Sheet4?或 GetSheetByName?像这样的东西: var sh = SpreadsheetApp.getActiveSheet(); var tab4 = sh.getSheetByName('Sheet4') var data = tab4.getDataRange().getValues();
    • @B D 我再次道歉。我更新了我的答案。你能确认一下吗?
    猜你喜欢
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 2019-06-16
    • 1970-01-01
    相关资源
    最近更新 更多