pgS*_*ter 1 javascript google-apps-script
我正在循环访问各种文件,并试图找到一种方法来动态列出/捕获尽可能多的来自GAS 文件对象的信息。
如果我采用非动态方法,我会输入我想要捕获的每个属性,如下所示:
var zText = 'File Id:' + aFile.getId();
zText += "\n" + "getName: " + aFile.getName();
zText += "\n" + "getDateCreated: " + aFile.getDateCreated();
zText += "\n" + "getSize: " + aFile.getSize();
Run Code Online (Sandbox Code Playgroud)
ETC...
虽然上述方法最终会得到我想要的,但我想避免查找所有属性名称。我知道许多属性可能无法转换为字符串,但我希望至少按名称将它们隔离。
我认为我的问题与使用 stringify 的问题类似。但是,这不适用于 Google File 对象(它只返回字符串值{})。我猜这是因为很多属性都在调用函数?
我可以使用以下命令获取作为字符串列出的文件的所有属性/函数:Object.keys(aFile).forEach((prop)=> Logger.log(prop ));
但是,这不会返回每个函数的结果,其中许多是我不想执行的函数(即makeCopy)。
虽然可能有更好的方法,但我假设尝试执行以或开头的所有属性/函数可能是安全的。我不知道如何做到这一点,也找不到任何与此类用例匹配的内容。我确实看到了这篇关于使用executeFunctionByName的文章,但这在应用程序脚本环境中不起作用。如果它确实有效,我会使用类似的东西..getis
var allKeys = Object.keys(aFile);
for(var i=0;i<allKeys.length;i++){
var eachProperty = allKeys[i];
if(eachProperty.search(RegExp("^get|^is"))>-1 ){
//??? run the literal name of function on aFile and print result?
Logger.log(eachProperty + ':' + executeFunctionByName(eachProperty,aFile));
}
}
Run Code Online (Sandbox Code Playgroud)
如果有我不知道的更好的方法,请随时重定向我。
虽然我不确定我是否能正确理解您的预期结果,但以下示例脚本怎么样?
function getObj_(file) {
const exclude = ["getAccess", "getAs", "getSecurityUpdateEligible", "getSecurityUpdateEnabled"];
const obj = {};
for (let method in file) {
if (!exclude.includes(method) && /^get|^is/.test(method)) {
obj[method] = file[method]();
}
}
return obj;
}
function sample1() {
const file = DriveApp.getFileById("###fileId###");
const res = getObj_(file);
console.log(res)
}
function sample2() {
const res = [];
const files = DriveApp.getFolderById("###folderId###").getFiles();
while (files.hasNext()) {
res.push(getObj_(files.next()));
}
console.log(res)
}
Run Code Online (Sandbox Code Playgroud)
运行此脚本时,将获得以下结果。在此测试中,sample1运行到电子表格。关键是方法。在这种情况下,Class 对象包含在值中。请注意这一点。
运行时sample2,以下对象将包含在数组中。
{
"getOwner": DriveUser,
"getViewers": "",
"getThumbnail": Blob,
"getTargetId": null,
"getDownloadUrl": null,
"getTargetMimeType": null,
"getTargetResourceKey": null,
"getMimeType": "application/vnd.google-apps.spreadsheet",
"getEditors": "",
"getName": "filename",
"getId": "###",
"getSize": 12345,
"isStarred": false,
"getParents": FolderIterator,
"getDescription": null,
"isTrashed": false,
"getUrl": "https://docs.google.com/spreadsheets/d/###/edit?usp=drivesdk",
"getResourceKey": null,
"getSharingAccess": "PRIVATE",
"getSharingPermission": "NONE",
"getDateCreated": Date,
"getLastUpdated": Date,
"getBlob": Blob,
"isShareableByEditors": true
}
Run Code Online (Sandbox Code Playgroud)
我认为当如下使用Drive API时,也可以检索文件元数据。但是,从您的问题来看,我猜测您可能想使用 Drive 服务 (DriveApp) 而不是 Drive API。因此,我提出了上面的示例脚本。如果您的目标包括使用 Drive API,则可能可以使用以下脚本。
const obj = Drive.Files.list({ q: `'${folderId}' in parents and trashed=false`, fields: "*", corpora: "allDrives", includeItemsFromAllDrives: true, supportsAllDrives: true, maxResults: 1000 });
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
66 次 |
| 最近记录: |