Google apps script 遍历Google Drive中的文件夹/子文件夹/文件并获取视频持续时间

Google apps script 遍历Google Drive中的文件夹/子文件夹/文件并获取视频持续时间,google-apps-script,Google Apps Script,我的目标是计算Google Drive文件夹所有子目录中所有视频的总长度(以秒为单位)。 我从这里得到了答案:尝试创建一个脚本,该脚本在文件夹中的所有目录中进行迭代,并获取文件计数,如果文件是视频,则获取文件名和视频持续时间 我目前正在使用: function testTraverse(){ var originFolder = DriveApp.getFoldersByName('All Media').next(); var totalCount = traverseFolder(

我的目标是计算Google Drive文件夹所有子目录中所有视频的总长度(以秒为单位)。

我从这里得到了答案:尝试创建一个脚本,该脚本在文件夹中的所有目录中进行迭代,并获取文件计数,如果文件是视频,则获取文件名和视频持续时间

我目前正在使用:

function testTraverse(){
  var originFolder = DriveApp.getFoldersByName('All Media').next(); 
  var totalCount = traverseFolder(originFolder,0);
  Logger.log('total files = '+totalCount);
}

 function getVideoDuration(folder,folderId, files) {  
  var q = "'" + folderId + "' in parents and trashed=false";
  var fields = "files(mimeType,name,videoMediaMetadata)"; 
  var url = "https://www.googleapis.com/drive/v3/files?q=" + encodeURIComponent(q) + "&fields=" + encodeURIComponent(fields) + "&access_token=" + ScriptApp.getOAuthToken();
  var res = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
  var obj = JSON.parse(res);  

   for (var i = 0; i < obj.files.length; i++) {
      sum += obj.files[i].videoMediaMetadata.durationMillis / 1000; 
   }
   Logger.log("Total duration: " + sum);    
 }

function traverseFolder(folder,total) {
  var name = folder.getName();
  var count = 0;
  var files = folder.getFiles();     
  var folderId = folder.getId();     


  while (files.hasNext()) {
    count++; 
    getVideoDuration(folderId, files);

  }

  var subs = folder.getFolders();
  while (subs.hasNext()) {
    total+=traverseFolder(subs.next(),count);
  }
  return total;
}
这让人困惑,因为我所在的目录中有多个文件

我不太了解的函数是getVideoDuration,我从这里的答案中的示例脚本中使用了它:

我想要的结果是计算所有子目录中所有视频的总长度(以秒为单位)

有没有更简单的方法

  • 您希望检索特定文件夹中所有子文件夹下的所有文件
  • 从已检索的所有文件中,您只希望检索视频文件。您需要检索文件数、文件名和视频文件的总长度
  • 您希望使用谷歌应用程序脚本实现这一点
如果我的理解是正确的,那么这个答案呢?请把这看作是几个可能的答案之一

修改点:
  • 我认为您的
    错误无法读取未定义的
    的属性“length”是由于以下两个原因造成的。
    
  • 关于
    getVideoDuration(folderId,files)
    traverseFolder
    中,您将
    folderId,files
    作为参数发送。但是在
    getVideoDuration
    功能中,脚本是
    getVideoDuration(文件夹、文件夹、文件)
    。这样,就不会使用文件夹ID。而且,
    文件
    不用于
    getVideoDuration
  • 从中,
    access\u token
    的查询参数现在不能使用。因此需要在请求头使用访问令牌。我认为我已经修改了与此相关的答案。但我忘了修改到。我为此道歉
  • sum
    未声明。这样,就会发生错误
  • 当除视频以外的文件位于文件夹中时,在
    obj.files[i].videoMediaMetadata.durationMillis
    处会发生错误
当上述各点反映到脚本中时,它将变成如下所示

修改脚本:
//请运行此函数。
函数testTraverse(){
var originFolder=DriveApp.getFoldersByName('All Media').next();
var res=traverseFolder(原始文件夹,{totalLength:0,totalFiles:0,文件名:[]});
Logger.log(res)
}
函数getVideoDuration(folderId,o){
var q=“”+folderId+”,在父级中,trashed=false;
var fields=“文件(mimeType、名称、videoMediaMetadata)”;
变量url=”https://www.googleapis.com/drive/v3/files?q=“+encodeURIComponent(q)+”&fields=“+encodeURIComponent(fields);
var res=UrlFetchApp.fetch(url,{muteHttpExceptions:true,头:{authorization:“Bearer”+ScriptApp.getOAuthToken()}});
var obj=JSON.parse(res);
对于(var i=0;i
  • 在本例中,结果返回一个对象,如
    {totalLength:###,totalFiles:##,filename:[###]}
    totalLength
    totalFiles
    filenames
    分别是视频长度的总长度、视频文件的总数和视频文件的文件名
注:
  • 不幸的是,我不确定你的视频文件的模拟类型。因此,如果找到模拟类型,我认为可以稍微降低工艺成本。因为这些文件可以由mimeTypes检索
  • 我认为这个修改后的脚本可以在有V8和没有V8的情况下运行
参考:
如果我误解了你的问题,而这不是你想要的方向,我道歉

Cannot read property 'length' of undefined
// Please run this function.
function testTraverse() {
  var originFolder = DriveApp.getFoldersByName('All Media').next(); 
  var res = traverseFolder(originFolder, {totalLength: 0, totalFiles: 0, filenames: []});
  Logger.log(res)
}

function getVideoDuration(folderId, o) {
  var q = "'" + folderId + "' in parents and trashed=false";
  var fields = "files(mimeType,name,videoMediaMetadata)"; 
  var url = "https://www.googleapis.com/drive/v3/files?q=" + encodeURIComponent(q) + "&fields=" + encodeURIComponent(fields);
  var res = UrlFetchApp.fetch(url, {muteHttpExceptions: true, headers: {authorization: "Bearer " + ScriptApp.getOAuthToken()}});
  var obj = JSON.parse(res);
  for (var i = 0; i < obj.files.length; i++) {
    var file = obj.files[i];
    if (file.hasOwnProperty("videoMediaMetadata")) {
      o.filenames.push(file.name);
      o.totalFiles++;
      o.totalLength += file.videoMediaMetadata.durationMillis / 1000;
    }
  }
 }

function traverseFolder(folder, obj) {
  var name = folder.getName();
  var count = 0;
  var files = folder.getFiles();
  var folderId = folder.getId();
  if (files.hasNext()) getVideoDuration(folderId, obj);
  var subs = folder.getFolders();
  while (subs.hasNext()) {
    traverseFolder(subs.next(), obj);
  }
  return obj;
}