根据值将一行移动到另一行
Moving one row to another based on value
我正在尝试根据一个单元格(触发单元格)的值将数据从一个 Google Sheet 选项卡移动到另一个选项卡。 "trigger" 单元格是距特定任务截止日期的天数。该值是使用一个简单的代码来计算天数差异的。
我在获取代码到 运行 时遇到了一些问题。我有另一个 sheet 做 similiar-ish 事情并使用相同的代码,它似乎工作正常。任何人都可以给我一双新的眼睛看看我现在做了什么愚蠢的事情吗?我试图重写它,但仍然有同样的问题。
我重写了代码,从网上复制粘贴,逐行阅读,我似乎找不到问题所在。
function moveToDue() {
var UpToDate = "Up To Date";
var Due = "Due";
var triggerDue = "21";
var triggerCol = 26;
var url = "https://docs.google.com/spreadsheets/d/blahblahblahblah";
var ss = SpreadsheetApp.openByUrl(url);
var sheet = ss.getSheetByName(UpToDate);
var range = sheet.getActiveCell();
//Move to Due
if (sheet.getName() == UpToDate && range.getColumn() == triggerCol && range.getValue() == triggerDue) {
var targetSheet = ss.getSheetByName(Due);
var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).moveTo(targetRange);
sheet.deleteRow(range.getRow());
}
}
UpToData 和 Due 是不同的标签标题。
triggerDue 是需要触发移动的到期日之前的天数(在本例中为 21)。
triggerCol 是触发器值所在的列。
sheet 的副本:
https://docs.google.com/spreadsheets/d/1-shzMIIlj247YFWY4Cc1bh6gW895lQWsjvc5gTi-fto/edit?usp=sharing
更改这些:
var url = "https://docs.google.com/spreadsheets/d/blahblahblahblah";
var ss = SpreadsheetApp.openByUrl(url);
致:
var ss=SpreadsheetApp.getActive();
这仅在用户打开电子表格时起作用,因为他们必须 select 一行。根据我的测试,当您在服务器上打开 spreadsheet/sheet 时,活动单元格始终是 "A1".
答案:
存在一些代码问题,包括 .getActiveCell()
和某些 if
和 for
逻辑的不正确使用。
代码修复:
你的代码中还有一些你可以清理的东西 - 你不需要检查 if (sheet.getName() == UpToDate)
因为你之前在 var sheet = ss.getSheetByName(UpToDate);
上设置了这两行而不改变任何东西.
我重写了很多函数以使其 运行 更高效。此外,如果 运行 与 moveTo()
在一个循环中,.deleteRow()
似乎并不总是有效,因此我添加了一个函数以在之后清理行。
代码:
function moveToDue() {
var triggerDue = 21;
var triggerCol = 26;
var url = "https://docs.google.com/spreadsheets/d/blahblahblahblah";
var ss = SpreadsheetApp.openByUrl(url);
var upToDate = ss.getSheetByName("Up To Date");
var targetSheet = ss.getSheetByName("Due");
var daysUntilEnd = upToDate.getRange(3, 26, upToDate.getLastRow() - 2).getValues();
for (var i = 0; i < (upToDate.getLastRow() - 2); i++) {
if (daysUntilEnd[i][0] <= triggerDue) {
var targetLocation = targetSheet.getRange(targetSheet.getDataRange().getLastRow() + 1, 1, 1, 26);
var uTDRange = upToDate.getRange(i + 3, 1, 1, 26);
uTDRange.moveTo(targetLocation);
}
}
deleteEmptyRows(upToDate);
}
function deleteEmptyRows(utds) {
for (var i = 0; i < utds.getLastRow(); i++) {
if (utds.getRange('A' + (i + 1)).getValue() == "") {
utds.deleteRow(i + 1);
}
}
}
参考文献:
我正在尝试根据一个单元格(触发单元格)的值将数据从一个 Google Sheet 选项卡移动到另一个选项卡。 "trigger" 单元格是距特定任务截止日期的天数。该值是使用一个简单的代码来计算天数差异的。
我在获取代码到 运行 时遇到了一些问题。我有另一个 sheet 做 similiar-ish 事情并使用相同的代码,它似乎工作正常。任何人都可以给我一双新的眼睛看看我现在做了什么愚蠢的事情吗?我试图重写它,但仍然有同样的问题。
我重写了代码,从网上复制粘贴,逐行阅读,我似乎找不到问题所在。
function moveToDue() {
var UpToDate = "Up To Date";
var Due = "Due";
var triggerDue = "21";
var triggerCol = 26;
var url = "https://docs.google.com/spreadsheets/d/blahblahblahblah";
var ss = SpreadsheetApp.openByUrl(url);
var sheet = ss.getSheetByName(UpToDate);
var range = sheet.getActiveCell();
//Move to Due
if (sheet.getName() == UpToDate && range.getColumn() == triggerCol && range.getValue() == triggerDue) {
var targetSheet = ss.getSheetByName(Due);
var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).moveTo(targetRange);
sheet.deleteRow(range.getRow());
}
}
UpToData 和 Due 是不同的标签标题。
triggerDue 是需要触发移动的到期日之前的天数(在本例中为 21)。
triggerCol 是触发器值所在的列。
sheet 的副本: https://docs.google.com/spreadsheets/d/1-shzMIIlj247YFWY4Cc1bh6gW895lQWsjvc5gTi-fto/edit?usp=sharing
更改这些:
var url = "https://docs.google.com/spreadsheets/d/blahblahblahblah";
var ss = SpreadsheetApp.openByUrl(url);
致:
var ss=SpreadsheetApp.getActive();
这仅在用户打开电子表格时起作用,因为他们必须 select 一行。根据我的测试,当您在服务器上打开 spreadsheet/sheet 时,活动单元格始终是 "A1".
答案:
存在一些代码问题,包括 .getActiveCell()
和某些 if
和 for
逻辑的不正确使用。
代码修复:
你的代码中还有一些你可以清理的东西 - 你不需要检查 if (sheet.getName() == UpToDate)
因为你之前在 var sheet = ss.getSheetByName(UpToDate);
上设置了这两行而不改变任何东西.
我重写了很多函数以使其 运行 更高效。此外,如果 运行 与 moveTo()
在一个循环中,.deleteRow()
似乎并不总是有效,因此我添加了一个函数以在之后清理行。
代码:
function moveToDue() {
var triggerDue = 21;
var triggerCol = 26;
var url = "https://docs.google.com/spreadsheets/d/blahblahblahblah";
var ss = SpreadsheetApp.openByUrl(url);
var upToDate = ss.getSheetByName("Up To Date");
var targetSheet = ss.getSheetByName("Due");
var daysUntilEnd = upToDate.getRange(3, 26, upToDate.getLastRow() - 2).getValues();
for (var i = 0; i < (upToDate.getLastRow() - 2); i++) {
if (daysUntilEnd[i][0] <= triggerDue) {
var targetLocation = targetSheet.getRange(targetSheet.getDataRange().getLastRow() + 1, 1, 1, 26);
var uTDRange = upToDate.getRange(i + 3, 1, 1, 26);
uTDRange.moveTo(targetLocation);
}
}
deleteEmptyRows(upToDate);
}
function deleteEmptyRows(utds) {
for (var i = 0; i < utds.getLastRow(); i++) {
if (utds.getRange('A' + (i + 1)).getValue() == "") {
utds.deleteRow(i + 1);
}
}
}