Google apps script 遍历Google Drive中的文件夹/子文件夹/文件并获取视频持续时间
我的目标是计算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(
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
。这样,就不会使用文件夹ID。而且,getVideoDuration(文件夹、文件夹、文件)
不用于文件
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;
}