2016-07-06 2 views
3

У меня есть два столбца: row[0] и row[1] в моей таблице в таблицах Google. Даты внутри них являются предварительными, как написано dd.mm.yyyy в то время как я хочу, чтобы автоматически заменить . на / внутри них и получить даты, отформатированные в dd/mm/yyyy и тем не менее не конвертировать эти dd/mm/yyyy, например, 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: Cannot find function replace in object Sun May 01 2016 00:00:00 GMT+0300 (MSK). (line 16, file ...


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

Вы, кажется, смущены тем, как даты преобразуются в строки. Вы можете сделать некоторые исследования. Преобразование '.' To '/' работает, но функция «toString» - это то, что вызывает у вас горе. – deltree

+0

@deltree, хорошо, но как я могу заменить в существующих., Не преобразовывая его в строки? Буду признателен, если вы предоставите мне пару ссылок, описывающих мое дело, потому что мой поиск не был успешным. – RLearnsR

ответ

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

Для получения дополнительной информации о яваскрипте даты, проверить 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(".", "/"); 
} 
+0

Я только что обновил описание сообщения с отредактированным исходным кодом. Пожалуйста, не могли бы вы проверить, не пропустил ли я что-нибудь. – RLearnsR

+0

@RLearnsR обновлено для ya – deltree

+0

'(checkInDate.getMonth() + 1) .toString() + '/' + checkInDate.getDate(). ToString() + '/' + checkInDate.getFullYear(). ToString()' это 'mm/dd/yyyy', а не' dd.mm.yyyy'. – RLearnsR

0

Google Apps Script имеет встроенную функцию для этой цели:

Utilities.formatDate (дата, часовой пояс, формат)

, например: Utilities.formatDate (строка [0], «EST», «MM/dd/yyyy»)

+0

мои извинения: Utilities.formatDate (новая дата (строка [0]), 'EST', "MM/dd/yyyy") – user2970721

+0

Добавлен в мой скрипт. Спасибо, сэр! – RLearnsR

+0

Добро пожаловать! – user2970721

Смежные вопросы