通过将点替换为斜杠来格式化日期的问题

时间:2016-07-06 13:58:53

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

我在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)?我们非常感谢您对相关建议的任何帮助。

<小时/> UPD№1。上面有评论以及一个答案我更新了我的源代码,现在是:

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

感谢您为解决此问题所做的一切贡献!

3 个答案:

答案 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");