我在Google Spreadsheets的电子表格中有两列row[0]
和row[1]
。其中的日期初步写为dd.mm.yyyy
,而我想自动将.
替换为/
,并将日期格式化为dd/mm/yyyy
,但不会转换这些日期dd/mm/yyyy
{1}}例如,在脚本的第二次迭代中Fri Sep 02 2016 00:00:00 GMT+0300 (MSK)
。
我在Stackoverflow上搜索了这个并找到了很多提示,但不幸的是我没有成功实现预期的结果。
以下是我发现的内容以及我尝试添加的内容:Replacing all dots in a string with backslashes in Java。已经观察到相同的负面影响。
这是我的源代码:
function FormatCheckInAndCheckOutDates() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 2; // Строка с первым бронированием для начала обработки
var numRows = sheet.getLastRow()-1; // Количество строк с бронированиями для обработки
var dataRange = sheet.getRange(startRow, 1, numRows, 3); // Охват столбцов для обработки ячеек, в данном случае с 1-го по 3-й.
var data = dataRange.getValues(); // Получить значение ячеек в каждой ячейке каждой строке в рамках столбцов, охваченных верхним кодом.
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var checkInDate = row[0].toString().valueOf();
var checkOutDate = row[1].toString().valueOf();
var replaceDotsInCheckIn = checkInDate.replace(".", "/");
var replaceDotsInCheckOut = checkOutDate.replace(".", "/");
sheet.getRange(startRow + i, 1).setValue(replaceDotsInCheckIn);
sheet.getRange(startRow + i, 2).setValue(replaceDotsInCheckOut);
SpreadsheetApp.flush(); // Здесь завершается обновление ячеек 17-го столбца, в котором проставляется статус отправки уведомлений.
Logger.log("Произведена замена точек на слэши в датах заезда и выезда всех существующих бронирований.");
}
}
当我第二次/第三次/ ...运行我的脚本时,如何防止将02.09.2016
转换为Fri Sep 02 2016 00:00:00 GMT+0300 (MSK)
?我们非常感谢您对相关建议的任何帮助。
function FormatCheckInAndCheckOutDates() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = SpreadsheetApp.getActiveSheet();
var startRow = 2; // Строка с первым бронированием для начала обработки
var numRows = sheet.getLastRow()-1; // Количество строк с бронированиями для обработки
var dataRange = sheet.getRange(startRow, 1, numRows, 3); // Охват столбцов для обработки ячеек, в данном случае с 1-го по 3-й.
var data = dataRange.getValues(); // Получить значение ячеек в каждой ячейке каждой строке в рамках столбцов, охваченных верхним кодом.
for (var i = 0; i < data.length; ++i) {
var row = data[i];
/* var checkInDate = row[0].toString().valueOf();
var checkOutDate = row[1].toString().valueOf(); */
var checkInDate = new Date(row[0].replace(/\./g, '/'));
var checkOutDate = new Date(row[1].replace(/\./g, '/'));
var replaceDotsInCheckIn = (checkInDate.getMonth() + 1).toString() + '/' + checkInDate.getDate().toString() + '/' + checkInDate.getFullYear().toString();
var replaceDotsInCheckOut = (checkOutDate.getMonth() + 1).toString() + '/' + checkOutDate.getDate().toString() + '/' + checkOutDate.getFullYear().toString();
sheet.getRange(startRow + i, 1).setValue(replaceDotsInCheckIn);
sheet.getRange(startRow + i, 2).setValue(replaceDotsInCheckOut);
SpreadsheetApp.flush(); // Здесь завершается обновление ячеек 17-го столбца, в котором проставляется статус отправки уведомлений.
}
Logger.log("Произведена замена точек на слэши в датах заезда и выезда всех существующих бронирований.");
}
但我仍然会听到以下错误:
TypeError:无法在对象中找到函数替换2016年5月1日 00:00:00 GMT + 0300(MSK)。 (第16行,档案......
<小时/> UPD№2。我在源头之下来了,我终于想到了:
function FormatCheckInAndCheckOutDates() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheetName = "2016"; // Здесь указывается название листа таблицы, в котором требуется производить форматирование дат заезда и выезда.
var sheet = ss.getSheetByName(sheetName);
var startRow = 2; // Строка с первым бронированием для начала обработки.
var numRows = sheet.getLastRow()-1; // Количество строк с бронированиями для обработки.
var dataRange = sheet.getRange(startRow, 1, numRows, 3); // Охват столбцов для обработки ячеек, в данном случае с 1-го по 3-й.
var data = dataRange.getValues(); // Получить значение ячеек в каждой ячейке каждой строке в рамках столбцов, охваченных верхним кодом.
for (var i = 0; i < data.length; ++i) {
var row = data[i];
var checkInDate = row[0];
var checkOutDate = row[1];
if (typeof checkInDate == "object") { // Здесь обрабатываем даты заезда.
var formattedCheckInDate = Utilities.formatDate(checkInDate, "GMT+0300", "dd/MM/yyyy");
} else {
var formattedCheckInDate = checkInDate.toString().valueOf().replace(/\./g, "/");
Logger.log("В дате заезда в строке № " + [i+2] + " разделяющие точки были заменены на слэши.");
}
if (typeof checkOutDate == "object") { // Здесь обрабатываем даты выезда.
var formattedCheckOutDate = Utilities.formatDate(checkOutDate, "GMT+0300", "dd/MM/yyyy");
} else {
var formattedCheckOutDate = checkOutDate.toString().valueOf().replace(/\./g, "/");
Logger.log("В дате выезда в строке № " + [i+2] + " разделяющие точки были заменены на слэши.");
}
sheet.getRange(startRow + i, 1).setValue(formattedCheckInDate); // Обновляем столбец значениями обработанных дат заезда.
sheet.getRange(startRow + i, 2).setValue(formattedCheckOutDate); // Обновляем столбец значениями обработанных дат выезда.
SpreadsheetApp.flush();
}
}
感谢您为解决此问题所做的一切贡献!
答案 0 :(得分:0)
使用斜杠替换点的代码工作正常,问题是Google文档在这里做了一些简单的逻辑来自动转换类型。
Google文档会自动将看似日期的内容转换为日期。然后,当您尝试检索该值时,执行以下操作:
var checkInDate = row[0].toString().valueOf();
var checkOutDate = row[1].toString().valueOf();
此时,Date()
对象正在转换为您不喜欢的格式。
您需要的是在获得结果之前手动执行toString
。你可以用这样的东西做到这一点。
var checkInDate = (row[0].getMonth() + 1).toString() + '/' + row[0].getDate().toString() + '/' + row[0].getFullYear().toString()
以下是此数据可以看到的不同方式的示例。
var date = '12.21.2012';
console.log(date);
var cleanDate = new Date(date.replace(/\./g, '/'));
console.log(cleanDate);
console.log((cleanDate.getMonth() + 1).toString() + '/' + cleanDate.getDate().toString() + '/' + cleanDate.getFullYear().toString());
有关javascript日期的更多信息,请查看https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
根据更新:
您尝试在replace
的对象上运行Date
,而不是字符串。文档中的数据已经以Date
的形式返回。
基本上,在您的特定情况下,点替换没有做任何事情:
这就是我按照上面的方式写的原因。 row[0]
已经是Date对象。您需要将其作为所需格式的字符串存储在变量中。
尝试替换它:
var checkInDate = new Date(row[0].replace(/\./g, '/'));
var checkOutDate = new Date(row[1].replace(/\./g, '/'));
var replaceDotsInCheckIn = (checkInDate.getMonth() + 1).toString() + '/' + checkInDate.getDate().toString() + '/' + checkInDate.getFullYear().toString();
var replaceDotsInCheckOut = (checkOutDate.getMonth() + 1).toString() + '/' + checkOutDate.getDate().toString() + '/' + checkOutDate.getFullYear().toString();
sheet.getRange(startRow + i, 1).setValue(replaceDotsInCheckIn);
sheet.getRange(startRow + i, 2).setValue(replaceDotsInCheckOut);
用这个:
var checkInDate = (row[0].getMonth() + 1).toString() + '/' + row[0].getDate().toString() + '/' + row[0].getFullYear().toString();
var checkOutDate = (row[1].getMonth() + 1).toString() + '/' + row[1].getDate().toString() + '/' + row[1].getFullYear().toString();
sheet.getRange(startRow + i, 1).setValue(checkInDate);
sheet.getRange(startRow + i, 2).setValue(checkOutDate);
你说“第二次和第三次运行我的脚本”,这意味着你的数据可能会因为这个脚本而改变格式。这让我怀疑你的数据可能以12.21.2012
开始,但是你的脚本正在将其修改为12/21/2012
但是当你去阅读它时,你的脚本找到2012-12-21T05:00:00.000Z
或者一些其他的愚蠢。因此,您正在寻找一个解决多个问题的一体化解决方案。这也很容易,只需使用类型检查。
var checkInDate = '';
if (typeof row[0] === 'object') {
checkInDate = (row[0].getMonth() + 1).toString() + '/' + row[0].getDate().toString() + '/' + row[0].getFullYear().toString();
}
else {
checkInDate = row[0].toString().replace(".", "/");
}
答案 1 :(得分:0)
Google Apps脚本具有内置功能:
Utilities.formatDate(date,timeZone,format)
例如: Utilities.formatDate(row [0],&#34; EST&#34;,&#34; MM / dd / yyyy&#34;)
答案 2 :(得分:0)
您可以使用momentjs转换为斜杠日期:
let d = "26.08.2020";
let dats = moment(d, "DD.MM.YYYY").toDate();
let formattedDate = moment(dats).format("DD/MM/YYYY");