如何将 Google 驱动器文件详细信息放入电子表格
How to get Google Drive file details into spreadsheet
我想从 Google 驱动器获取文件详细信息,并将它们存储在 Google 电子表格中。
我找到了这段代码,但它给出了一个错误:
Cannot find function next in object Files. (line 2, file "Code")
代码来自 this blog, possibly evolved from this gist.
/**
* List all files in Google Drive folder.
*
* http://ctrlq.org/code/19854-list-files-in-google-drive-folder
* https://gist.github.com/hubgit/3755293
*/
function listFilesInFolder(folderName) {
var folder = DriveApp.getFoldersByName(folderName).next();
var contents = folder.getFiles();
var file, data, sheet = SpreadsheetApp.getActiveSheet();
sheet.clear();
sheet.appendRow(["Name", "Date", "Size", "URL", "Download", "Description", "Type"]);
for (var i = 0; i < contents.length; i++) {
file = contents[i];
if (file.getFileType() == "SPREADSHEET") {
continue;
}
data = [
file.getName(),
file.getDateCreated(),
file.getSize(),
file.getUrl(),
"https://docs.google.com/uc?export=download&confirm=no_antivirus&id=" + file.getId(),
file.getDescription(),
file.getFileType().toString()
];
sheet.appendRow(data);
}
};
你可以改变这个:
function listFilesInFolder(folderName) {
var folder = DriveApp.getFoldersByName(folderName).next();
为此:
function listFilesInFolder() {
var folderName = "type your folder name here between the quotes";
var folder = DriveApp.getFoldersByName(folderName).next();
显然,您是 运行 代码,因此 "hard code" 通过键入 您的 文件夹的文件夹名称名称进入声明。
正如 Sandy 的回答所指出的,您收到的错误消息是因为 DriveApp.getFoldersByName(folderName)
没有找到文件夹对象。
但是,您仍然会遇到问题,因为当 FilesList 被弃用时,您引用的脚本仅部分转换为使用 DriveApp。
它把folder.getFiles()
的结果当作一个数组,而实际上它是一个迭代器。
DriveApp 文件没有 getFileType()
方法,相反它们支持 getMimeType()
,并且有一个 MimeType
enumerator 可以与之比较。
该代码中的下载 URL 不再有效。您可以从 Advanced Drive API 导出 link - 我刚刚注释掉了有问题的代码。
代码
此代码的更完整版本可在 this gist 中找到。
/**
* List all files in Google Drive folder.
*
* @param {string} folderName (optional) Name of folder on Google Drive
*
* Adapted from:
* http://ctrlq.org/code/19854-list-files-in-google-drive-folder
* https://gist.github.com/hubgit/3755293
*/
function listFilesInFolder(folderName) {
// If we have not been provided a folderName, assume we will interact with user.
var interactive = (typeof folderName === 'undefined');
// Get name of folder to list
if (interactive) {
folderName = Browser.inputBox("List files in folder", "Enter folder name", Browser.Buttons.OK_CANCEL);
}
if (folderName === '') return; // No name provided, exit quietly
var folders = DriveApp.getFoldersByName(folderName);
if (!folders.hasNext()) {
if (interactive) Browser.msgBox("Folder not found.");
return;
}
var folder = folders.next();
var contents = folder.getFiles();
var file, data, sheet = SpreadsheetApp.getActiveSheet();
sheet.clear();
sheet.appendRow(["Name", "Date", "Size", "URL", /*"Download",*/ "Description", "Type"]);
// Loop over files in folder, using file iterator
while (contents.hasNext()) {
file = contents.next();
if (file.getMimeType() == MimeType.GOOGLE_SHEETS) { // "SPREADSHEET"
// Skip displaying spreadsheets - I don't know why...
continue;
}
data = [
file.getName(),
file.getDateCreated(),
file.getSize(),
file.getUrl(),
//"https://docs.google.com/uc?export=download&confirm=no_antivirus&id=" + file.getId(),
file.getDescription(),
niceFileType( file.getMimeType() )
];
sheet.appendRow(data);
}
}
niceFileType
辅助函数
/**
* Get nice, readable file type matching given MimeType.
* Refer to https://developers.google.com/apps-script/reference/base/mime-type
*
* @param {string} mimeType File type to match
*
* @return {string} "UNKNOWN" or matched file type.
*/
function niceFileType( mimeType ) {
// Supported file types stored in global fileType object for fast lookups.
if (typeof this.fileType === 'undefined') {
// Initialize global fileType object first time only.
this.fileType = {};
// ...
this.fileType[MimeType.FOLDER] = "Folder";
// ...
this.fileType[MimeType.GOOGLE_APPS_SCRIPT] = "Google Apps Script";
this.fileType[MimeType.GOOGLE_DOCS] = "Google Doc";
this.fileType[MimeType.GOOGLE_DRAWINGS] = "Google Drawing";
this.fileType[MimeType.GOOGLE_FORMS] = "Google Form";
this.fileType[MimeType.GOOGLE_SHEETS] = "Google Sheet";
// ...
}
// If we know the given filetype, return its name.
return (this.fileType.hasOwnProperty(mimeType)) ? this.fileType[mimeType] : "UNKNOWN";
}
我想从 Google 驱动器获取文件详细信息,并将它们存储在 Google 电子表格中。 我找到了这段代码,但它给出了一个错误:
Cannot find function next in object Files. (line 2, file "Code")
代码来自 this blog, possibly evolved from this gist.
/**
* List all files in Google Drive folder.
*
* http://ctrlq.org/code/19854-list-files-in-google-drive-folder
* https://gist.github.com/hubgit/3755293
*/
function listFilesInFolder(folderName) {
var folder = DriveApp.getFoldersByName(folderName).next();
var contents = folder.getFiles();
var file, data, sheet = SpreadsheetApp.getActiveSheet();
sheet.clear();
sheet.appendRow(["Name", "Date", "Size", "URL", "Download", "Description", "Type"]);
for (var i = 0; i < contents.length; i++) {
file = contents[i];
if (file.getFileType() == "SPREADSHEET") {
continue;
}
data = [
file.getName(),
file.getDateCreated(),
file.getSize(),
file.getUrl(),
"https://docs.google.com/uc?export=download&confirm=no_antivirus&id=" + file.getId(),
file.getDescription(),
file.getFileType().toString()
];
sheet.appendRow(data);
}
};
你可以改变这个:
function listFilesInFolder(folderName) {
var folder = DriveApp.getFoldersByName(folderName).next();
为此:
function listFilesInFolder() {
var folderName = "type your folder name here between the quotes";
var folder = DriveApp.getFoldersByName(folderName).next();
显然,您是 运行 代码,因此 "hard code" 通过键入 您的 文件夹的文件夹名称名称进入声明。
正如 Sandy 的回答所指出的,您收到的错误消息是因为 DriveApp.getFoldersByName(folderName)
没有找到文件夹对象。
但是,您仍然会遇到问题,因为当 FilesList 被弃用时,您引用的脚本仅部分转换为使用 DriveApp。
它把
folder.getFiles()
的结果当作一个数组,而实际上它是一个迭代器。DriveApp 文件没有
getFileType()
方法,相反它们支持getMimeType()
,并且有一个MimeType
enumerator 可以与之比较。该代码中的下载 URL 不再有效。您可以从 Advanced Drive API 导出 link - 我刚刚注释掉了有问题的代码。
代码
此代码的更完整版本可在 this gist 中找到。
/**
* List all files in Google Drive folder.
*
* @param {string} folderName (optional) Name of folder on Google Drive
*
* Adapted from:
* http://ctrlq.org/code/19854-list-files-in-google-drive-folder
* https://gist.github.com/hubgit/3755293
*/
function listFilesInFolder(folderName) {
// If we have not been provided a folderName, assume we will interact with user.
var interactive = (typeof folderName === 'undefined');
// Get name of folder to list
if (interactive) {
folderName = Browser.inputBox("List files in folder", "Enter folder name", Browser.Buttons.OK_CANCEL);
}
if (folderName === '') return; // No name provided, exit quietly
var folders = DriveApp.getFoldersByName(folderName);
if (!folders.hasNext()) {
if (interactive) Browser.msgBox("Folder not found.");
return;
}
var folder = folders.next();
var contents = folder.getFiles();
var file, data, sheet = SpreadsheetApp.getActiveSheet();
sheet.clear();
sheet.appendRow(["Name", "Date", "Size", "URL", /*"Download",*/ "Description", "Type"]);
// Loop over files in folder, using file iterator
while (contents.hasNext()) {
file = contents.next();
if (file.getMimeType() == MimeType.GOOGLE_SHEETS) { // "SPREADSHEET"
// Skip displaying spreadsheets - I don't know why...
continue;
}
data = [
file.getName(),
file.getDateCreated(),
file.getSize(),
file.getUrl(),
//"https://docs.google.com/uc?export=download&confirm=no_antivirus&id=" + file.getId(),
file.getDescription(),
niceFileType( file.getMimeType() )
];
sheet.appendRow(data);
}
}
niceFileType
辅助函数
/**
* Get nice, readable file type matching given MimeType.
* Refer to https://developers.google.com/apps-script/reference/base/mime-type
*
* @param {string} mimeType File type to match
*
* @return {string} "UNKNOWN" or matched file type.
*/
function niceFileType( mimeType ) {
// Supported file types stored in global fileType object for fast lookups.
if (typeof this.fileType === 'undefined') {
// Initialize global fileType object first time only.
this.fileType = {};
// ...
this.fileType[MimeType.FOLDER] = "Folder";
// ...
this.fileType[MimeType.GOOGLE_APPS_SCRIPT] = "Google Apps Script";
this.fileType[MimeType.GOOGLE_DOCS] = "Google Doc";
this.fileType[MimeType.GOOGLE_DRAWINGS] = "Google Drawing";
this.fileType[MimeType.GOOGLE_FORMS] = "Google Form";
this.fileType[MimeType.GOOGLE_SHEETS] = "Google Sheet";
// ...
}
// If we know the given filetype, return its name.
return (this.fileType.hasOwnProperty(mimeType)) ? this.fileType[mimeType] : "UNKNOWN";
}