2017-09-21 16 views
0

私は以下のスクリプトを実行していましたが、utilities.sleepとappフラッシュ機能を追加した後ではありません。誰かが私が間違ったことを見ることができますか? "nameofspreadsheet"が実行されると、スクリプトが実行され、ブック名から取得された正しいシート名がA2に格納されるまでに数秒かかります。つまり、バックアップスクリプトは実行されますが、シートが使用された日付ではなく、アーカイブシートに01/01/1970という日付が入ります(複数のコピーを数か月前に作成していますので、使用する日にバックアップするだけです)。Utilities.sleepが期待どおり実行されていません

function onOpen() { // This function adds a custom menu to the spreadsheet (Backup to archive) so you can run the script from there. 
    var ui = SpreadsheetApp.getUi(); 
    ui.createMenu('Backup') 
    .addItem('Backup','dataBackup') 
    .addToUi(); 
} 

function nameOfSpreadsheet() 
{ 
    var s=SpreadsheetApp.getActive().getName().replace(/(\d{1,2}\.\d{1,2}\.\d{1,2}).*/, 
'$1'); 
    return s; 
} 

function dataBackup() { 
    var inputSS = SpreadsheetApp.getActiveSpreadsheet(); 
    var archiveSS = SpreadsheetApp.openById('146WU8RghfFqlCpCSX7n6kBAKOyxcpVKt14yhVfvYz-g'); 
    var user = Session.getActiveUser().getEmail(); 
    var sheetNames = ['AM trip', 'PM trip', 'Pool/Beach', 'Night Dive']; 
    for (var i = 0; i < sheetNames.length; i++) { 

     var inputSheet = inputSS.getSheetByName(sheetNames[i]); 
     var archiveSheet = archiveSS.getSheetByName(sheetNames[i]); 

     var date = inputSheet.getRange('A2').getValue(); // Changed to stop inadvertent cell changes, also made text white so not seen. 
     var data = inputSheet.getRange('E7:U37').getValues().filter(function(row) { return row[0] !== '' || row[1] !== ''}); 

     for (var x = 0; x < data.length; x++) { 
      data[x].splice(0, 0, date); 
     } 
     var getDate = archiveSheet.getRange(archiveSheet.getLastRow(), 1).getValue(); 
     var maxRowLength = data.reduce(function(length, row) { return Math.max(length, row.length); }, 0); 
     var date = new Date(date); 

     if (date.getDate() === "Loading Data...") { 
    Utilities.sleep(10000); 
    SpreadsheetApp.flush(); 

      if (getDate.getDate() != date.getDate() || getDate.getMonth() != date.getMonth()) {  

       if (data.length != 0) { 
        archiveSheet.insertRowsAfter(archiveSheet.getLastRow(), data.length); 
        archiveSheet.getRange(archiveSheet.getLastRow() + 1, 1, data.length, maxRowLength).setValues(data); 
       } else { 
        archiveSheet.insertRowsAfter(archiveSheet.getLastRow(), 1); 
        archiveSheet.getRange(archiveSheet.getLastRow() + 1, 1, 1, 2).setValues([[date, 'No Data']]); 
       } 
      } 
     } 
    } 
} 
+0

どこが間違った日付になっていますか?あなたのコードは、データ行の先頭に正しい日付を追加するために働くようです。だから、ゼロの日付出力はどこにありますか? –

答えて

0

date.getDate() === "Loading Data..."常にfalseとtrueになりますちょうどスクリプト上

var date = new Date(date); 

この行はdateに日時を割り当て、以下の行を持っているので、実行されることはありません場合のようにdate.getDate( date)は、dateが有効な引数であれば整数を返します。ところで、通常、変数名を再利用し、スペル/ライティングの変数名を使用する方がキーワードに似ています。これは特定のプログラマーに混乱を招く可能性があるためです。

date.getDateは()それは、JavaScriptの仕様の一部ではありません。この文字列として「...データのロード」を返すことはありませんが、それはGoogleシートからです。

上記を考慮すると、問題はUtilities.sleep()ではありません。

あなたは

var date = inputSheet.getRange('A2').getValue(); 

は、その行の前に含まれなければならない「データのロード...」にUtilities.sleep(ミリ秒)を返すことができることを恐れている場合。

SpreadsheetApp.flush()に関しては、スクリプトがスプレッドシートに重要な変更を加えた後に含める必要があります。あなたのコード上の場所はforブロックの最後にあるかもしれませんが、OPスクリプトのロジックを再考するほうが良いかもしれません。

関連する問題