Regex 谷歌表单公式转换Youtube';s API ISO 8601持续时间格式
我有一个GoogleSheet脚本,可以获取youtube的视频持续时间。问题在于时间数据采用ISO 8601格式 例如:Regex 谷歌表单公式转换Youtube';s API ISO 8601持续时间格式,regex,google-apps-script,google-sheets,iso8601,re2,Regex,Google Apps Script,Google Sheets,Iso8601,Re2,我有一个GoogleSheet脚本,可以获取youtube的视频持续时间。问题在于时间数据采用ISO 8601格式 例如: PT3M23S 我现在使用的公式很好地将其转换为更可读的格式 =iferror(REGEXREPLACE(getYoutubeTime(B20),"(PT)(\d+)M(\d+)S","$2:$3")) 它将上述内容转换为更可读的格式3:23 现在的问题是,视频的持续时间是否正好为3分钟,或者视频的持续时间是否短于1分钟,regexreplace不会对其进行重新格式化
PT3M23S
我现在使用的公式很好地将其转换为更可读的格式
=iferror(REGEXREPLACE(getYoutubeTime(B20),"(PT)(\d+)M(\d+)S","$2:$3"))
它将上述内容转换为更可读的格式3:23
现在的问题是,视频的持续时间是否正好为3分钟,或者视频的持续时间是否短于1分钟,regexreplace不会对其进行重新格式化
相反,它是这样写的
PT4M OR PT53S
是否有办法编辑公式以解决可能出现的每个变量
将PT4M格式化为4:00,或将PT53S格式化为0:53
最后,如果持续时间内的秒数在1-9之间,API将返回秒数的一位数值。这意味着上面的公式看起来是错误的。例如,PT1M1S应为1:01时被格式化为1:1
如果公式能够解释前9秒,并添加0以使其更具可读性,那就太好了
感谢您阅读本文,如果有人能帮助我,我将非常感激
为了以防万一,在脚本本身中更容易执行此操作,下面是检索视频持续时间的自定义脚本
function getYoutubeTime(videoId){
var url = "https://www.googleapis.com/youtube/v3/videos?part=contentDetails&id=" + videoId;
url = url + "&key=";
var videoListResponse = UrlFetchApp.fetch(url);
var json = JSON.parse(videoListResponse.getContentText());
return json["items"][0]["contentDetails"]["duration"];
}
非常难看,但似乎适用于提供的示例:
=iferror(left(mid(A1,3,len(A1)-2),find("M",mid(A1,3,len(A1)-2))-1)*60,0)+substitute(REGEXreplace(mid(A1,3,len(A1)-2),"(.+M)",""),"S","")
从PT3M23S
输出秒数,例如203
。若要更改为00:03:23
wap,请在(…)/86400
中使用上述公式并将结果格式化为时间。脚本解决方案:
function iso8601HMparse(str) {
return str.replace(/PT(\d+(?=M))?M?(\d+(?=S))?S?/g,function(mm,p1,p2){//regex to get M and S value
return [0,p1,p2].map(function(e){
e = e ? e:0;
return ("00"+e).substr(-2); //fix them to 2 chars
}).join(':');
})
}
将其拼接到脚本中,如下所示:
return iso8601HMparse(json["items"][0]["contentDetails"]["duration"].toString());
电子表格功能:
=TEXT(1*REGEXREPLACE(REGEXREPLACE(A1,"PT(\d+M)?(\d+?S)?","00:00$1:00$2"),"[MS]",),"MM:SS")
派对迟到了,但我用的是:
=TIMEVALUE(
IFERROR(TEXT(MID(A1,3,FIND("H",A1)-3),"00"),"00")&":"&
IFERROR(TEXT(MID(A1,IFERROR(FIND("H",A1)+1,3),FIND("M",A1)-IFERROR(FIND("H",A1)+1,3)),"00"),"00")&":"&
IFERROR(TEXT(MID(A1,IFERROR(FIND("M",A1)+1,3),FIND("S",A1)-IFERROR(FIND("M",A1)+1,3)),"00"),"00"))
您还可以将ARRAYFORMULA粘贴在前面,并将A1更改为a列,以获取整个列表的值。@pnuts显示的格式是ISO 8601格式的持续时间,而不是日期/时间-太好了,我可以使用它并将秒数转换为我需要的格式!我用这个公式来完成抓取你的公式将数字转换为的值,并将格式更改为duration,这正是我所需要的<代码>=iferror(数组公式(如果(len(E4:E)、time(,int(E4:E/60)、mod(E4:E,60))))对于超过1小时的视频,它不起作用。例如:YouTube上的视频有1:13:02,函数返回
00:00:001H13M2S
@pancake试试这个。如果这样不行,我也会把正则表达式修好几个小时。它现在工作得很好,谢谢!