我对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);
}
}
}
答案 0 :(得分:0)
问题的症结在于,您不是直接获取要查看的范围,而是使用活动范围(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()
。
答案 1 :(得分:0)
要拥有“基于活动单元”的解决方案,您需要利用onEdit
事件的MySQL docs参数。
检查范围是否是您要测试的范围,然后测试值是否正确,然后检查其他范围(在此情况下为列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());
}
}
}
}