在 Google 电子表格中基于 1 个单元格移动一行并验证第二个单元格不是空白的



我对 Google 表格脚本相当陌生,我正在尝试修改我当前的脚本,该脚本根据第 20 列中的"y"或"n"值将行从同一工作簿中的一个工作表移动到另一个工作表。新脚本仍将查看第 20 列中的"y"或"n",但我希望它也查看第 19 列以验证那里是否有值。这是我到目前为止的代码,但它不起作用:

function onEdit() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = SpreadsheetApp.getActiveSheet();
var r = SpreadsheetApp.getActiveRange();
if (s.getName() == "2018 2 Week Snapshot for Jim"
&& r.getColumn() == 20
&& r.getValue() == "y") {
if (s.getName() == "2018 2 Week Snapshot for Jim"
&& r.getColumn() == 19
&& r.getValue(r.isBlank()) == false) {
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Reviewed 2018 2 Week Snapshot for Jim");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
s.deleteRow(row);
}
}
if (s.getName() == "2018 2 Week Snapshot for Jim"
&& r.getColumn() == 20
&& r.getValue() == "n") {
if(s.getName() == "2018 2 Week Snapshot for Jim"
&& r.getColumn() == 19
&& r.getValue(r.isBlank()) == false) {
var row = r.getRow();
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Reviewed 2018 2 Week Snapshot for Jim");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).moveTo(target);
s.deleteRow(row);
}
}
}

要获得"基于活动单元格"的解决方案,您需要利用onEdit事件的e参数。

检查范围是否是您要测试的范围,然后测试该值是否正确,然后检查另一个范围(在本例中为 S 列(的相同内容。

您将在检查后moveTo范围到目标电子表格并删除移动的行。

代码将执行以下操作:

function onEdit(e)
{
if (e.range.getColumn() == 20)
{
if(e.value == "Y" || e.value == "N" || e.value == "y" || e.value == "n" )
{
var val = e.source.getActiveSheet().getRange("S" + e.range.getRow()).getValue();
if (val == "Y" || val == "y" || val == "N" || val == "n")
{
var destSheetName = "Reviewed 2018 2 Week Snapshot for Jim";
var destSheet = e.source.getSheetByName(destSheetName);
e.source.getActiveSheet().getRange(e.range.getRow(), 1, 1, e.source.getActiveSheet().getLastColumn()).moveTo(destSheet.getRange(destSheet.getLastRow() + 1 , 1, 1, e.source.getActiveSheet().getLastColumn()));
e.source.getActiveSheet().deleteRow(e.range.getRow());
}
}
}
}

问题的症结在于,您不是直接获取要查看的范围,而是使用活动范围 (var r = SpreadsheetApp.getActiveRange();( 并在两个嵌套的if语句中检查该范围是否在第 19 行和第 20 行,以及该范围是否既空白又包含某些内容("y"或"n"(。换句话说,为了进入你的第一个代码块,必须满足以下条件:

s.getName() == "2018 2 Week Snapshot for Jim"
&& r.getColumn() == 20
&& r.getValue() == "y") {
&& s.getName() == "2018 2 Week Snapshot for Jim"
&& r.getColumn() == 19
&& r.getValue(r.isBlank()) == false

不用说,这在逻辑上是有问题的:-(

顺便说一句,r.getValue(r.isBlank()) == false没有多大意义 - 如果您正在寻找第 19 列为空白,您可能希望r.isBlank()。我的回答反映了这一点,如果我弄错了,你应该颠倒这个条件。

我还注意到,无论您在第 20 列中找到"y"还是"n",您的操作看起来都相同:无论哪种情况,您都会删除原始行并将其粘贴到"Jim 的 2018 年 2 周快照"中。我的答案保留了区别,因为我假设你想做其他事情,条件是看到 y/n。

无论如何,这应该做我认为你想做的事情(注意所有的警告吗? :D(

function onEdit() {
var r = SpreadsheetApp.getActiveRange();  // The range being edited
var s = r.getSheet();                     // Its sheet
if (s.getName() != "2018 2 Week Snapshot for Jim") {
// We're not editing the sheet we're interested in...
return;
}
var activeRow = r.getRow();  // What row number are we on?
var colNineteenNotBlank = !s.getRange(activeRow, 19).isBlank();  // Or did you need this *not* to be blank?
var colTwentyValue = s.getRange(activeRow, 20).getValue();
var numColumns = s.getLastColumn();
var sourceRange = s.getRange(activeRow,    // start this row
1,            // start column 1 (A)
1,            // range should be 1 row
numColumns);  // range should be this many columns
var targetSheet = ss.getSheetByName("Reviewed 2018 2 Week Snapshot for Jim");
var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1,
1,
1,
numColumns);
if (colTwentyValue == "y" && colNineteenNotBlank) {
sourceRange.moveTo(targetRange);
} else if (colTwentyValue == "n" && colNineteenNotBlank) {
// maybe you wanted something else here?
sourceRange.moveTo(targetRange);
}
}

这仍然不是防弹的;如果目标工作表填满了,我不确定从工作表的"末端"获得一个范围是否有效。如果这很常见,我会检查targetSheet.getMaxRow()targetSheet.getLastRow()匹配,如果是这样,我会做一个targetSheet.appendRow()

相关内容

最新更新