2016-07-06 1 views
3

Google 스프레드 시트의 스프레드 시트에 row[0]row[1] 인 두 개의 열이 있습니다. 내가 자동으로 내부 /에 의해 .를 교체하고 dd/mm/yyyy로 포맷 된 날짜를 얻고 그럼에도 불구하고 스크립트의 두 번째 반복에서, 예를 들어,에 Fri Sep 02 2016 00:00:00 GMT+0300 (MSK)이러한 dd/mm/yyyy을 변환하지 않습니다 할 때 그 안에서 날짜는 dd.mm.yyyy로 작성 예비 있습니다.점을 점 대신 슬래시로 바꾸는 형식의 문제

나는 이것을 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.2016Fri 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

날짜가 문자열로 변환되는 방법에 대해 혼동스러워 보입니다. 당신은 약간의 조사를하고 싶을지도 모른다. '.'에서'/'로의 변환은 작동하지만 "toString"함수는 여러분에게 슬픔의 원인입니다. – deltree

+0

@deltree, ok,하지만 어떻게'.' 기존의 날짜를 문자열로 변환하지 않고 대체 할 수 있습니까? 내 수색이별로 성공하지 못했기 때문에 내 사건을 설명하는 몇 가지 링크를 제공 해주시면 감사하겠습니다. – 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() 

다음은이 데이터를 볼 수있는 여러 가지 방법의 예입니다.

당신은 객체에 replace을 실행하려는 :

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


체크 아웃 그것은입니다. 0이 아니라 문자열입니다. 문서의 데이터가 이미 Date으로 되돌아 왔습니다.

기본적으로, 특정 시나리오에서, 도트 교체는 아무것도하지 않는 : 나는 그것을 내가 위에서했던 방법을 쓴 이유

이입니다. row[0]은 이미 Date 객체입니다. 변수에 원하는 형식의 문자열로 저장해야합니다.

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

당신은 "둘째와 셋째 내 스크립트 실행"라고 데이터가 이것 때문에 포맷을 변화 할 수 있음을 의미한다 :이와

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

:

봅니다이 교체 스크립트. 귀하의 데이터가 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가 – deltree

+0

에 업데이트되었습니다. (checkInDate.getMonth() +1) .toString() + '/'+ checkInDate.getDate(). toString() + '/'+ checkInDate.getFullYear(). toString()' 'dd.mm.yyyy'보다는'mm/dd/yyyy'입니다. – RLearnsR

0

Google 애플리케이션 스크립트는이 목적을 위해 기능이 내장되어 있습니다 :

Utilities.formatDate (날짜,, TIMEZONE 형식) 예를 들어

: Utilities.formatDate (행 [0] "EST", "MM/dd/yyyy")

+0

사과 : Utilities.formatDate (새 날짜 (행 [0]), 'EST', 'MM/dd/yyyy') – user2970721

+0

내 스크립트에 추가되었습니다. 감사합니다! – RLearnsR

+0

당신을 환영합니다! – user2970721

관련 문제