我正在尝试根据一个单元格(触发单元格)的值将数据从一个Google表格标签移动到另一个标签。 “触发”单元格是直到特定任务的截止日期为止的天数。使用简单的代码即可计算出该天数的差值。
我在运行代码时遇到一些问题。我还有另一张纸做的类似的事情,并使用相同的代码,它似乎工作正常。谁能给我新鲜的眼神,看看我现在做了什么愚蠢的事情?我试图重写它,仍然有同样的问题。
我重写了代码,从Internet复制和粘贴,逐行阅读,我似乎找不到问题。
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是触发值所在的列。
工作表副本: https://docs.google.com/spreadsheets/d/1-shzMIIlj247YFWY4Cc1bh6gW895lQWsjvc5gTi-fto/edit?usp=sharing
答案 0 :(得分:1)
存在一些代码问题,包括对.getActiveCell()
的使用不正确以及某些if
和for
逻辑。
您的代码中还有一些可以清除的内容-您无需进行检查if (sheet.getName() == UpToDate)
,因为您可以在var sheet = ss.getSheetByName(UpToDate);
上设置这两行而无需进行任何更改。< / p>
我重新编写了许多功能,以使其更有效地运行。另外,.deleteRow()
如果在循环中与moveTo()
一起运行似乎并不总是有效,因此我添加了一个函数来清理行。
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);
}
}
}
答案 1 :(得分:0)
更改这些:
var url = "https://docs.google.com/spreadsheets/d/blahblahblahblah";
var ss = SpreadsheetApp.openByUrl(url);
至:
var ss=SpreadsheetApp.getActive();
这仅在用户打开电子表格时起作用,因为他们必须选择一行。根据我的测试,当您在服务器上打开电子表格/工作表时,活动单元格始终为“ A1”。