我有一个Google表格脚本,可获取youtube的视频时长。问题是时间数据为ISO 8601格式。
例如:
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"];
}
答案 0 :(得分:2)
非常丑陋,但似乎可以用于所提供的示例:
=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","")
输出秒,例如203
中的PT3M23S
。要更改为00:03:23
,请在( ... )/86400
中套用上述公式,并将结果格式化为时间。
答案 1 :(得分:1)
脚本解决方案:
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")
答案 2 :(得分:0)
聚会迟到了,但这是我正在使用的:
=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 更改为一列以获取它们的整个列表的值。