2013-01-17 3 views
1

날짜 및 우선 순위가 첨부 된 작업 항목이있는 스프레드 시트가 있습니다. 아이템이 우선 순위 2이고 나이가 1 주 이상인 경우 행을 보관하는 함수를 만들고 싶습니다.Apps 스크립트를 사용하여 날짜가 포함 된 Google 스프레드 시트에 보관

이 스크립트는 제 스크립트이지만, 잘못된 우선 순위로 이동하거나 때로는 잘못된 날짜로 이동하는 경우가 있습니다. 최악의 경우, "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."); 
} 

답변

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."); 
} 
+0

작동합니다. 행을 삭제하는 루프를 만들었지 만 날짜를 구문 분석하는 방식에는 아무런 변화가 없습니다. 디버깅 할 때 날짜가 표시되지 않는 이유가 궁금하지만 코드에 나타났습니다. 여전히 혼란 스럽지만, 귀하의 도움에 매우 감사드립니다! – user1786546

+0

죄송합니다. 충분히 명확하지 않았습니다. 즉, 아카이브 된 행을 삭제하면 실제 비교 및 ​​이동이 발생하는 메인 루프 외부에 있어야합니다. 행을 삭제하면 아직 시트에서 처리 된 데이터의 행 번호가 변경되지만 함수의 시작 부분에서 읽은 값에는 변경되지 않기 때문입니다. 오늘 밤 7 시부 터 Logger.log 호출을 추가하여 NaN 오류를 유발하는 숫자가 포함 된 문자열을 혼합하지 않도록했습니다. – jad

+0

오, 알았어! 선명도를 가져 주셔서 너무 고맙습니다. – user1786546

관련 문제