Regex 谷歌表单公式转换Youtube';s API 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不会对其进行重新格式化

我有一个GoogleSheet脚本,可以获取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"];
}

非常难看,但似乎适用于提供的示例:

=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试试这个。如果这样不行,我也会把正则表达式修好几个小时。它现在工作得很好,谢谢!