根据 1 个单元格在 google 电子表格中移动一行并验证第二个单元格不为空
Moving a row on google spreadsheet based on 1 cell and verifying second cell is not blank
我是 Google 表格脚本的新手,我正在尝试修改我当前的脚本,该脚本根据 [=14= 在同一工作簿中将行从一个 sheet 移动到另一个 "y" 或第 20 列中的 "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);
}
}
}
问题的症结在于,您不是直接获取想要查看的范围,而是使用活动范围 (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",您的操作看起来都是一样的:无论哪种情况,您都删除了原始行并将其粘贴到 "Reviewed 2018 2 Week Snapshot for Jim." 我的回答保留了区别,因为我假设你还想做其他事情,条件是看到 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);
}
}
这仍然不是防弹的;如果目标 sheet 填满,我不确定从 sheet 的 "end" 中获取范围是否可行。如果这很常见,我会检查 targetSheet.getMaxRow()
和 targetSheet.getLastRow()
是否匹配,如果匹配则执行 targetSheet.appendRow()
。
要获得 "based-on active cell" 解决方案,您需要利用 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());
}
}
}
}
我是 Google 表格脚本的新手,我正在尝试修改我当前的脚本,该脚本根据 [=14= 在同一工作簿中将行从一个 sheet 移动到另一个 "y" 或第 20 列中的 "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);
}
}
}
问题的症结在于,您不是直接获取想要查看的范围,而是使用活动范围 (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",您的操作看起来都是一样的:无论哪种情况,您都删除了原始行并将其粘贴到 "Reviewed 2018 2 Week Snapshot for Jim." 我的回答保留了区别,因为我假设你还想做其他事情,条件是看到 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);
}
}
这仍然不是防弹的;如果目标 sheet 填满,我不确定从 sheet 的 "end" 中获取范围是否可行。如果这很常见,我会检查 targetSheet.getMaxRow()
和 targetSheet.getLastRow()
是否匹配,如果匹配则执行 targetSheet.appendRow()
。
要获得 "based-on active cell" 解决方案,您需要利用 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());
}
}
}
}