1

日付と優先度が添付されたアクション アイテムを含むスプレッドシートがあります。アイテムが優先度 2 で、1 週間以上経過した場合に行をアーカイブする関数を作成したいと考えています。

これは私のスクリプトですが、実際には動作しています。間違った優先順位を移動したり、間違った日付を移動したり、移動すべきすべての日付を移動することはありません。最悪の場合、「アクション アイテム」シートの下部に大量の空の行が追加され、「アーカイブ」シートにも空の行が作成されます。

明らかに何かがおかしいのですが、激しいデバッグを 1 日行った後でも、実際にはわかりません。どんな助けでも啓発し、感謝します!

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

1 に答える 1

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.");
} 
于 2013-01-17T07:23:55.443 に答える