Конвертировать строку даты в дату "Не жестко закодированная дата" - PullRequest
1 голос
/ 21 октября 2019

1) приведенный ниже код извлекает данные из нескольких листов в папке и объединяет все даты в одном листе.

2) на этой вкладке комбинированных листов с функцией максимальной даты.

var maxDate = SS.getRange("MaxDate!A1").getValue();

3) листы в папке имеют формат даты и времени, подобный этому 08-09-2019 10:59 AM.

4) я сделал сценарий зацикливания на всех листах и ​​сравнил дату на этих листах с функцией максимальной даты в комбинированном листе, и если дата превышает максимальную дату, извлекает эти данные, поэтому в основном он выбирает самые последние данные.

5) проблема в том, что когда я делаю код ниже, он читает эту дату 08-09-2019 10:59 AM в виде строки и возвращает 1970-00-01, я пытался поместить переменную даты в new Date();, чтобы преобразовать ее в дату, но явсе еще есть та же проблема, и когда я удаляю new Date();, это выдает мне ошибку can't find method formatDate(string, string, string).

Поэтому мне нужна помощь, чтобы преобразовать эту переменную даты fileDate в фактическую дату

fileHeaders = fileSheet.getRange(1, 1, 1, fileSheet.getLastColumn()).getValues();
dateCol = fileHeaders[0].indexOf('Creation date and time')+1;
fileDate = new Date(fileSheet.getRange(2,dateCol,1,1).getValue());
dateFormat = Utilities.formatDate(fileDate, "GMT+2", "yyyy-mm-dd"); 
function combineData() {  
  var folder = DriveApp.getFolderById("17eFdVXdVE3sxemcC_qO0QfY71zKU4YLh");
  var filesIterator = folder.getFiles();
  var SS = SpreadsheetApp.getActiveSpreadsheet(); 
  var maxDate = SS.getRange("MaxDate!A1").getValue();
  var rDS = SS.getSheetByName('Raw Data');
  var oriColHeaders = rDS.getRange(1, 1, 1, SS.getSheetByName('Raw Data').getMaxColumns()).getValues();

  var file;
  var filetype;
  var fileDate;
  var dateFormat;
  var ssID;
  var combinedData = [];
  var data;
  var columnsHeaders;
  var colindex;

  while(filesIterator.hasNext()){
    file = filesIterator.next();    
    filetype = file.getMimeType();
    var fileSheet = SpreadsheetApp.open(file).getSheets()[0];
    var fileHeaders = fileSheet.getRange(1, 1, 1, fileSheet.getLastColumn()).getValues();
    var dateCol = fileHeaders[0].indexOf('Creation date and time')+1;

    fileDate = new Date(fileSheet.getRange(2,dateCol,1,1).getValue());
    dateFormat = Utilities.formatDate(fileDate, "GMT+2", "yyyy-mm-dd");
    Logger.log(dateFormat);

    if(filetype === "application/vnd.google-apps.spreadsheet" && dateFormat > maxDate) {
      ssID = file.getId();
      columnsHeaders = SpreadsheetApp.openById(ssID).getSheets()[0].getRange(1, 1, 1, SpreadsheetApp.openById(ssID).getSheets()[0].getMaxColumns()).getValues();

      for (var i = columnsHeaders[0].length - 1; i >= 0; i--) 
        if (oriColHeaders[0].indexOf(columnsHeaders[0][i]) === -1) {          

          SpreadsheetApp.open(file).getSheets()[0].deleteColumn(i+1);          
        }
    }
    data = SpreadsheetApp.openById(ssID).getSheets()[0].getRange("A2:AG" + SpreadsheetApp.openById(ssID).getSheets()[0].getLastRow()).getValues();
    combinedData = combinedData.concat(data);      
  }
  var activeWS = SS.getSheetByName("Raw Data");
  var activeWSLR = activeWS.getRange("S1:S").getValues().filter(String).length;

  if(combinedData.length > 0) {    
    activeWS.getRange(activeWSLR+1, 1, combinedData.length, combinedData[0].length).setValues(combinedData).sort(19);
  }
  else {
    SpreadsheetApp.getUi().alert('No new files.')
  }  
}

1 Ответ

0 голосов
/ 21 октября 2019

Похоже, что это ошибка!

Согласно документации скрипта приложений, кроме службы контактов:

Даты, используемые в других местах скрипта приложения, используют стандарт JavaScript Date object.

Используя консоль JavaScript вашего веб-браузера, вы можете видеть, что синтаксический анализ 08-09-2019 10:59 AM в new Date("08-09-2019 10:59 AM"); возвращается правильно:

Fri Aug 09 2019 10:59:00 GMT+0200 (Central European Summer Time)

AsВ результате я отправил сообщение об ошибке в систему отслеживания проблем Google, подробно описав это. Вы можете найти отчет о проблеме здесь и щелкнуть ☆ в левом верхнем углу, чтобы сообщить Google, что вы тоже столкнулись с проблемой.

Обходной путь:

Длятеперь, если ваши даты имеют одинаковый формат, вы можете преобразовать дату в формат, определенный в конструкторе дат веб-документов MDN *1023*:

function parseDate(date) {
  var parts = date.split(" ");
  var datePart = parts[0].split("-");
  var timePart = parts[1];
  var amPm = parts[2];

  if (amPm == "PM") {
    var temp = timePart.split(":");
    timePart = (parseInt(temp[0]) + 12).toString() + ":" + temp[1];
  }
  return new Date(datePart[2] + "-" + datePart[0] + "-" + datePart[1] + "T" + timePart + ":00");
}

Использование:

Вместо использования

fileDate = new Date(fileSheet.getRange(2, dateCol, 1, 1).getValue());

Вы можете использовать:

fileDate = parseDate(fileSheet.getRange(2, dateCol, 1, 1).getValue());

Рекомендации:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...