使用脚本或Google Sheets内置公式将字符串转换为日期格式



描述:我想将DD/MM/YYYY HH:mm25/01/2022 11:00字符串转换为可接受的日期格式。不管是哪一个,它只需要被Apps Script和Google Sheets识别并能够使用它。

如果你能提供一个应用程序脚本的代码(而不是像我尝试的那样在谷歌表单中使用公式),将字符串转换为日期,然后将值设置在另一个范围内,将其作为日期使用,我将不胜感激,谢谢。

如果它是谷歌表单公式,那没问题,只要它有效。

尝试:经过多次尝试,我试图构建一个自定义公式,将网页上的各个部分组合在一起,但它不起的作用

//formula is translated from italian
=ARRAYFORMULA(IF(F10:F="",,TEXT(DATE(
IF.ERROR(REGEXEXTRACT(F10:F, "/(d+) "), YEAR(F10:F))*1, 
IF.ERROR(REGEXEXTRACT(F10:F, "/(d+)"), MONTH(F10:F))*1,
IF.ERROR(REGEXEXTRACT(F10:F, "d+"),   DAY(F10:F))*1)+
IF.ERROR(TIME.VALUE(F10:F), REGEXEXTRACT(F10:F, "d+:d+")+
IF(REGEXMATCH(F10:F, "PM"), 0.5, 0)), "yyyy-mm-dd hh:mm")))

它给出一个#VALUE错误,上面写着"11:00’是一个字符串,不能被识别为日期";(11:00是一个例子)。

我也有正则表达式,但我不知道它是否正确,以及如何在代码中使用它:

/([d])w+/([d])w+/([d])w+s([d])w+:([d])w+/g

我还试着更改时区,但没有成功。请记住,我使用的是意大利时区,如果可能的话,我宁愿保持原样。

表格示例(正如我所说,重要的是日期被接受为日期):

F: 列源字符串
Q:列所需日期,可通过工作表识别为日期(Q,因为这是我想放公式的真实列)

FQ
2023年2月16日16:002023年2月6日16:00:00
2022年11月25日15:002022年11月5日15:00:00

使用电子表格公式进行文本字符串到日期时间的转换通常是最简单的。您可以在单元格G10:中使用此公式将类似25/01/2022 11:00的文本字符串转换为日期

=arrayformula( iferror( 1 / value( regexreplace( to_text(F10:F); "(d+)/(d+)/(d+) (d+):(d+)"; "$3-$2-$1 $4.$5" ) ) ^ -1 ) )

将结果列格式化为格式>数字>日期时间

如果您需要";"修复";这些日期时间值,您可以用静态值替换公式结果,其中Control+C用于复制,Control+Shift+V仅用于粘贴值,或者使用简单的range.setValues(range.getValues())脚本位执行相同操作。

如果您需要将这些日期时间值传递给Apps Script,通常最容易将它们作为Date对象而不是文本字符串获取。Date对象将引用与电子表格中的日期时间(在电子表格的时区中)相同的时间时刻(UTC)。

您应该注意,Apps Script是JavaScript,这意味着Date对象始终位于UTC时区。如果您记录它们或以其他方式输出它们,它们将不会如您所期望的那样显示在意大利时区中。

有两种简单的方法可以在电子表格的时区中以人类可读的格式显示这些日期。第一种是直接将数据作为文本字符串获取,格式如电子表格中所示:

function test1() {
const ss = SpreadsheetApp.getActive();
const dateStrings = ss.getRange('Sheet1!G10:G')
.getDisplayValues()
.flat()
.filter(String);
console.log(dateStrings);
}

第二种方法是将数据作为Date对象获取,并使用电子表格的时区将其转换为文本字符串,如下所示:

function test2() {
const ss = SpreadsheetApp.getActive();
const timezone = ss.getSpreadsheetTimeZone();
const dates = ss.getRange('Sheet1!G10:G')
.getValues()
.flat()
.filter(String)
.map(date =>
Object.prototype.toString.call(date) === '[object Date]'
? Utilities.formatDate(date, timezone, 'dd/MM/yyyy HH:mm')
: date
);
console.log(dates);
}

将字符串转换为日期:

function convert(s="25/01/2022 11:00") {
let [d,m,y,hr,mn] = s.split(/[/ :]/)
Logger.log('y: %s m: %s d: %s hr: %s mn: %s',y,m,d,hr,mn);
Logger.log(new Date(y,m - 1,d,hr,mn));
}
Execution log
10:58:11 AM Notice  Execution started
10:58:12 AM Info    y: 2022 m: 01 d: 25 hr: 11 mn: 00
10:58:12 AM Info    Tue Jan 25 11:00:00 GMT-07:00 2022
10:58:13 AM Notice  Execution completed

要在Google Apps脚本中将字符串转换为Date对象,请使用Utilities.parseDate.

示例:

function myFunction(){
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const timeZone = spreadsheet.getSpreadsheetTimeZone();
const date = Utilities.parseDate('25/01/2022 11:00',timeZone, 'dd/MM/yyyy HH:mm');
return date;
}

对于某些用例来说,将上述函数用作自定义函数可能没有意义,因为使用更高效、更不容易出现问题的内置函数可能会获得相同的结果。

使用内置函数的选项取决于电子表格设置,即DATEVALUE可能会为像25/01/2022这样的模糊日期返回不同的结果,因为对于某些地区,月份优先,而对于其他地区,月份第一。

当spreashet区域设置为意大利时,=DATEVALUE("25/01/2022")工作正常。您可能需要手动将单元格格式设置为日期,以使其显示日期,而不是时间序列化值(数字)。

要使用上述电子表格中的公式转换25/01/2022 11:00,请使用

=INDEX(SPLIT("25/01/2022 11:00";" ");1) + SUBSTITUTE(INDEX(SPLIT("25/01/2022 11:00";" ");2);":";".") 

上述公式有两个主要部分通过使用CCD_ 15连接起来。第一部分返回与日期对应的时间序列化值,第二部分返回与时间对应的时间串行化值。

阵列公式

=ArrayFormula(DATEVALUE(REGEXEXTRACT(F10:F;"^([ˆd/]+) "))+TIMEVALUE(SUBSTITUTE(REGEXEXTRACT(F10:F;" ([ˆd/:]+)$");":";".")))

与上一个公式的概念相同,但使用了REGEXEXTRACT而不是INDEX

Google有一个实用程序可以做到这一点!

let dateTime = '2022-12-16 13:00:00';
let timeZone = 'GMT';
let convertedDateTime = Utilities.formatDate(dateTime, timeZone, 'dd/MM/yyyy HH:ss')

查看Class Utilities了解更多信息。

最新更新