Google 表格中是否可以通过宏删除特定行的内容?
Is it possible to delete the content of specific rows by a macro in Google Sheets?
我有两个电子表格,一个叫做 "Input data",另一个叫做 "Assignment"。如果 "Assignment" 的 C 列中的 value/content(在我的例子中是一个名字)没有出现在 "Input data" 的 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)
,但这并没有真正起作用...你能帮帮我吗?
- 当"Assignment"的sheet中的"C4:C"的值在[=81的sheet中的"C3:C"的值中找不到时=],你想清除"Assignment"的sheet列"A"到"F"行的内容。
- 您想使用 Google Apps 脚本实现此目的。
如果我的理解是正确的,这个答案怎么样?请将此视为几个可能的答案之一。
模式 1:
在此模式中,您的脚本已被修改。请按如下方式修改您的脚本。
修改脚本
从:
s2.deleteRow(i+4);
到:
s2.getRange(i+4, 1, 1, 6).clearContent();
- 本例中,"A"到"F"行的内容被清空
模式二:
在这个模式中,首先,检索清除范围。范围列表被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, Ballack
和 Michael, BALLACK
作为相同的值。
从你的回复中,我明白了。对于上述情况,下面的修改怎么样?在这种情况下,使用 toUpperCase()
,比较来自 Input Data
和 Assignment
的两个值。
修改后的脚本:
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
}
}
}
我有两个电子表格,一个叫做 "Input data",另一个叫做 "Assignment"。如果 "Assignment" 的 C 列中的 value/content(在我的例子中是一个名字)没有出现在 "Input data" 的 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)
,但这并没有真正起作用...你能帮帮我吗?
- 当"Assignment"的sheet中的"C4:C"的值在[=81的sheet中的"C3:C"的值中找不到时=],你想清除"Assignment"的sheet列"A"到"F"行的内容。
- 您想使用 Google Apps 脚本实现此目的。
如果我的理解是正确的,这个答案怎么样?请将此视为几个可能的答案之一。
模式 1:
在此模式中,您的脚本已被修改。请按如下方式修改您的脚本。
修改脚本
从:s2.deleteRow(i+4);
到:
s2.getRange(i+4, 1, 1, 6).clearContent();
- 本例中,"A"到"F"行的内容被清空
模式二:
在这个模式中,首先,检索清除范围。范围列表被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, Ballack
和Michael, BALLACK
作为相同的值。
从你的回复中,我明白了。对于上述情况,下面的修改怎么样?在这种情况下,使用 toUpperCase()
,比较来自 Input Data
和 Assignment
的两个值。
修改后的脚本:
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
}
}
}