是否可以通过Google表格中的宏删除特定行的内容?

时间:2019-12-09 07:15:14

标签: google-apps-script google-sheets google-sheets-macros

我有两个电子表格,一个电子表格称为“输入数据”,另一个电子表格称为“分配”。如果在“输入数据”的C列中未出现“分配”的C列中的值/内容(在我的情况下为名称),则该行将通过完全正常的公式删除:

function checkName() {


  var s1 = SpreadsheetApp.getActive().getSheetByName("Input Data");
  var col1 = s1.getRange("C3:C").getValues();

  var s2 = SpreadsheetApp.getActive().getSheetByName("Assignment");
  var col2 = s2.getRange("C4:C").getValues();

  for (var i=col2.length-1; i>=0; i--) {
    var found = false;
    for (var j=0; j<col1.length; j++) {
       if (col1[j][0] == col2[i][0]) {
         found = true;
         break;
       }
    }

    if (!found) {
      s2.deleteRow(i+4);
    }
  }
}

是否可以仅删除这些特定行的内容或仅删除这些特定行的特定列中的内容?例如,仅像第30行的A-F列(如果它符合我上面描述的标准)。我尝试了s2.deleteContents(i+4),但那确实行不通...您能帮我吗?

1 个答案:

答案 0 :(得分:1)

  • 当在“输入数据”表的“ C3:C”的值中找不到“分配”表中的“ C4:C”的值时,您想清除该行的内容“任务”工作表的“ A”列到“ F”列。
  • 您想使用Google Apps脚本实现这一目标。

如果我的理解正确,那么这个答案如何?请认为这只是几个可能的答案之一。

模式1:

在这种模式下,您的脚本已被修改。请按如下所示修改脚本。

修改后的脚本

从:
s2.deleteRow(i+4);
至:
s2.getRange(i+4, 1, 1, 6).clearContent();
  • 在这种情况下,将清除该行中“ A”至“ F”列的内容。

模式2:

在这种模式下,首先要检索清除范围。并且范围列表由clearContent()清除。流程成本可能可以降低一些。

修改后的脚本

function checkName() {
  var s1 = SpreadsheetApp.getActive().getSheetByName("Input Data");
  var col1 = s1.getRange("C3:C" + s1.getLastRow()).getValues().map(function(e) {return e[0]});
  var s2 = SpreadsheetApp.getActive().getSheetByName("Assignment");
  var col2Range = s2.getRange("A4:F" + s2.getLastRow());
  var rangeList = col2Range.getValues().reduce(function(ar, e, i) {
    if (col1.indexOf(e[2]) == -1) ar.push("A" + (i + 4) + ":F" + (i + 4));
    return ar;
  }, []);
  // if (rangeList.length > 0) rangeList.push("A30:F30");
  s2.getRangeList(rangeList).clearContent();
}
  • 关于Like only column A-F of row 30 for example,如果您还想清除“ A30:F30”的内容,请删除//行中的// if (rangeList.length > 0) rangeList.push("A30:F30");。这样,当发生上述情况时,“ A30:F30”的内容也被清除。但是关于这一点,我不确定我是否能正确理解您的目标。我为此表示歉意。

参考:

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

已添加:

  • 您要使用模式1的修改后的脚本。
  • 您要使用Michael, BallackMichael, BALLACK作为相同的值。

从您的答复中,我可以理解。对于上述情况,如何进行以下修改?在这种情况下,使用toUpperCase(),可以比较来自Input DataAssignment的两个值。

修改后的脚本:

function checkName() {
  var s1 = SpreadsheetApp.getActive().getSheetByName("Input Data");
  var col1 = s1.getRange("C3:C").getValues();
  var s2 = SpreadsheetApp.getActive().getSheetByName("Assignment");
  var col2 = s2.getRange("C4:C").getValues();
  var found;
  for (var i=col2.length-1; i>=0; i--) {
    found = false;
    for (var j=0; j<col1.length; j++) {
       if (col1[j][0].toUpperCase() == col2[i][0].toUpperCase()) {  // Modified
         found = true;
         break;
       }
    }
    if (!found) {
      s2.getRange(i+4, 1, 1, 6).clearContent();  // Modified
    }
  }
}