如何检索Google Drive文件的所有Get/Is函数结果?

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)

如果有我不知道的更好的方法,请随时重定向我。

Tan*_*ike 6

虽然我不确定我是否能正确理解您的预期结果,但以下示例脚本怎么样?

示例脚本:

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)

参考: