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.')
}
}
答案 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());