将日期字符串转换为日期“非硬编码日期”

时间:2019-10-21 00:59:20

标签: google-apps-script google-sheets spreadsheet

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,我试图将date变量放入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 :(得分:1)

这似乎是一个错误!

根据Apps脚本文档,而不是针对“联系人”服务:

  

App Script中其他地方使用的日期使用JavaScript的标准Date对象。

使用Web浏览器的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)

结果,我在Google的问题跟踪器中提交了一个错误,详细说明了这一点。您可以找到问题报告here,然后单击左上角的☆,让Google知道您也遇到了问题。

解决方法:

就目前而言,只要您的日期都具有相同的格式,就可以将日期转换为MDN web docs的日期构造函数中定义的格式:

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());

参考文献: