2016-03-22 3 views
1

Googleデスクトップは、スプレッドシートで1日1回チェックし、値を別のシートにコピーし、そのセルの日付電流より小さい。Googleデスクトップで特定のセルの日付が現在の日付よりも小さい場合は行を削除する

ファイルは次のようになります。 enter image description here

そして、これは私がこれまでに書いたものです:

function DeleteIfDateIsToSmall(event) { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var s = event.source.getActiveSheet(); 
    var r = event.source.getActiveRange(); 
    var today = new Date(); 
    var today2 = Utilities.formatDate(today,'GMT+0200','dd.MM.yyyy'); 
    var startRow = 2; // First row of data to process 
    var numRows = sheet.getLastRow()-1 

    for (var i=2; i < numRows; i++) { 
    var DateCell = s.getRange(i, 13); 
    var sheetDate = DateCell.getValue() 
    var sheetDate2 = Utilities.formatDate(sheetDate,'GMT+0200','dd.MM.yyyy'); 
    var row = i; 
    var numColumns = s.getLastColumn(); 
    var targetSheet = ss.getSheetByName("Ended or Deleted"); 
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); 

    if (s.getName() == "Start" && sheetDate != 0 && sheetDate != "" && today2.valueOf() > sheetDate2.valueOf()){ 
     s.getRange(row, 1, 1, numColumns).moveTo(target); 
     s.deleteRow(row); 
    } 
    } 
} 

動作するようには思えない、助けてください。

答えて

0

ここでは、いくつかの問題が間違っているか、最適ではありません。

  1. タイムドトリガーの場合、event objectには範囲/ソースデータがありません。それは時間データしか持たない。あなたは名前でシートを選択する必要があります(または、これが必要な場合は、getSheetsによって得られたすべてのシートをループする必要があります)。
  2. Utilities.formatDateは文字列を返します。これは日付を比較する最良の方法ではありません。いずれにしてもvalueOfと呼ぶのは意味がないようです。
  3. ループにgetValueを使用する代わりに、ループに入る前に値を取得する方が効率的です(getValues)。あなたが外に出なければならないループには、他にもいくつかのことがあります。
  4. シート内で上から下に移動するときに行を削除することは、行がシフトしてインデックスを乱すので、難しいです。このため、配列内の削除する行を収集し、その行を下から上の順に削除します。

function DeleteIfDateIsTooSmall() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var s = ss.getSheetByName("Start"); 
    var numColumns = s.getLastColumn(); 
    var targetSheet = ss.getSheetByName("Ended or Deleted"); 
    var today = new Date(); 
    var dates = s.getRange(2, 13, s.getLastRow()-1, 1).getValues(); 
    var rowsToDelete = []; 
    for (var i = 0; i < dates.length; i++) { 
    if (dates[i][0] && dates[i][0] < today) { 
     var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1); 
     s.getRange(i + 2, 1, 1, numColumns).moveTo(target); 
     rowsToDelete.push(i + 2); 
    } 
    } 
    for (i = rowsToDelete.length - 1; i >= 0; i--) { 
    s.deleteRow(rowsToDelete[i]); 
    } 
} 
関連する問題