我有一个电子表格,其中包含附加日期和优先级的操作项。我想创建一个函数,如果该项是优先级2和一周或更长时间,则归档一行。
这是我的脚本,但它正在表现出来 - 有时它会移动错误的优先级,有时会移动错误的日期,并且它永远不会移动它应该的所有日期。最糟糕的是,它在我的“Action Items”表格底部添加了大量空行,并在“Archive”表格中创建了空行。
显然有些事情是错的,但即使经过一天的紧张调试,我也确实看不到它。任何帮助都会有启发和赞赏!
function Archiver() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Action Items'); // get the sheet
var targetsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Archive'); // get the target sheet
var columnF = sheet.getRange(2, 6, sheet.getLastRow()-1, 1); // get all the rows with dates
var fValues = columnF.getValues(); // get the values of dates
var columnE = sheet.getRange(2, 5, sheet.getLastRow()-1, 1); // get all the rows with priorities
var eValues = columnE.getValues(); // get the values of priorities
var day = 24*3600*1000 // calculate ms in a day
var today = parseInt((new Date().setHours(0,0,0,0))/day); // get date today
for (var i = 0; i < fValues.length; i++) { // repeat loop
var priority = eValues[i][0]; // set priority in loop
var dataday = parseInt(fValues[i][0].getTime()/day); // convert date column into miliseconds
Logger.log(dataday+" <= " + today-7 + " - " + priority) // my log isn't picking up day
if (dataday <= today-7 && priority == "P2") { // if an item is more than 7 days old and Priority 2...
targetsheet.insertRows(2,1)
// move the entire source row to the second row of target sheet
var rangeToMove = sheet.getRange(/*startRow*/ i + 2, /*startColumn*/ 1, /*numRows*/ 1, /*numColumns*/ sheet.getMaxColumns());
rangeToMove.moveTo(targetsheet.getRange("A2"));
// add date and time of when approved to target row in column E
targetsheet.getRange("M2").setValue(Date());
// delete row from source sheet
sheet.deleteRows(i + 2,1);
}
}
ss.toast("Move along.", "Archiving Complete.");
}
答案 0 :(得分:2)
我没有调试你的代码,但我最初的想法是在迭代时删除行会干扰数据的顺序并产生混淆,所以我调整它来复制行(而不是移动)并将行号存储到在数组中删除,以便我们可以在循环外删除它们。我做了一个快速测试,这似乎有效。
function Archiver() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Action Items'); // get the sheet
var targetsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Archive'); // get the target sheet
var columnF = sheet.getRange(2, 6, sheet.getLastRow()-1, 1); // get all the rows with dates
var fValues = columnF.getValues(); // get the values of dates
var columnE = sheet.getRange(2, 5, sheet.getLastRow()-1, 1); // get all the rows with priorities
var eValues = columnE.getValues(); // get the values of priorities
var day = 24*3600*1000 // calculate ms in a day
var today = parseInt((new Date().setHours(0,0,0,0))/day); // get date today
var rowsToDelete = [];
for (var i = 0; i < fValues.length; i++) { // repeat loop
var priority = eValues[i][0]; // set priority in loop
var dataday = parseInt(fValues[i][0].getTime()/day); // convert date column into miliseconds
Logger.log(dataday+" <= " + (today-7) + " - " + priority) // my log isn't picking up day
if (dataday <= today-7 && priority == "P2") { // if an item is more than 7 days old and Priority 2...
targetsheet.insertRows(2,1)
// move the entire source row to the second row of target sheet
var rangeToMove = sheet.getRange(/*startRow*/ i + 2, /*startColumn*/ 1, /*numRows*/ 1, /*numColumns*/ sheet.getMaxColumns());
rangeToMove.copyTo(targetsheet.getRange("A2"));
// add date and time of when approved to target row in column E
targetsheet.getRange("M2").setValue(Date());
// delete row from source sheet
rowsToDelete.push(i+2);
}
}
rowsToDelete.reverse();
for (var j = 0; j < rowsToDelete.length; j++) { sheet.deleteRow(rowsToDelete[j]); }
ss.toast("Move along.", "Archiving Complete.");
}