Google apps script 谷歌脚本API-如何在特定文件夹中创建谷歌文档

Google apps script 谷歌脚本API-如何在特定文件夹中创建谷歌文档,google-apps-script,google-drive-api,google-docs,Google Apps Script,Google Drive Api,Google Docs,基本上,这个问题回答了我想做的事情: 但它已经5年了,我想知道现在是否有更简单的方法。在我的例子中,我有很多现有的文件夹,我想通过一个每隔一段时间运行的脚本在每个文件夹中创建一个特定的文件 Thx 编辑: 好的,当文件夹“test folder”位于共享驱动器中时,下面的代码可以正常工作(使用答案中修改的示例脚本1) function testFunction() { const notesFileName = 'test doc'; const folderName = 'te

基本上,这个问题回答了我想做的事情:

但它已经5年了,我想知道现在是否有更简单的方法。在我的例子中,我有很多现有的文件夹,我想通过一个每隔一段时间运行的脚本在每个文件夹中创建一个特定的文件

Thx

编辑:

好的,当文件夹“test folder”位于共享驱动器中时,下面的代码可以正常工作(使用答案中修改的示例脚本1)

function testFunction() {
  
  const notesFileName = 'test doc';
  const folderName = 'test folder';
  const query = "title = '" + folderName + "'";
  // Find all folders that match the query.
  var folders = DriveApp.searchFolders(query);
  while (folders.hasNext()) {
    // In all the sub-folders, of each found folder, create a file with the same name.
    var folder = folders.next();
    Logger.log("Found a folder: " + folder);
    var subFolders = folder.getFolders();
    while( subFolders.hasNext() ) {
      var subFolder = subFolders.next();
      Logger.log('Folder id: ' + subFolder.getId());
      const doc = Drive.Files.insert({title: notesFileName, mimeType: MimeType.GOOGLE_DOCS, parents: [{id: subFolder.getId()}]}, null, {supportsAllDrives: true});
    }
  }
}

我相信你的目标如下

  const topFolderId = "### top folder ID ###";
  const folders = DriveApp.getFolderById(topFolderId).getFolders();
  const folderIds = [];
  while (folders.hasNext()) {
    folderIds.push(folders.next().getId());
  }
  function createDoc(folderID, name) {
    var folder = DriveApp.getFolderById(folderID);
    var doc = DocumentApp.create(name);
    DriveApp.getFileById(doc.getId()).moveTo(folder);
    return doc;
  }
  • 您想在特定文件夹中创建新的Google文档
  • 你有很多文件夹要创建新的谷歌文档。因此,您希望降低脚本的处理成本
在本例中,我建议使用驱动API创建新的Google文档。当使用驱动API时,可以通过异步过程来运行为每个文件夹创建Google文档的过程。示例脚本如下所示

  const topFolderId = "### top folder ID ###";
  const folders = DriveApp.getFolderById(topFolderId).getFolders();
  const folderIds = [];
  while (folders.hasNext()) {
    folderIds.push(folders.next().getId());
  }
  function createDoc(folderID, name) {
    var folder = DriveApp.getFolderById(folderID);
    var doc = DocumentApp.create(name);
    DriveApp.getFileById(doc.getId()).moveTo(folder);
    return doc;
  }
示例脚本1: 在使用此脚本之前。在这个示例脚本中,新的Google文档被创建到循环中的特定文件夹中

function sample1() {
  const titleOfDocument = "sample document";
  const folderIds = ["### folder ID1 ###", "### folder ID 2 ###",,,];
  const documentIds = folderIds.map(id => Drive.Files.insert({title: titleOfDocument, mimeType: MimeType.GOOGLE_DOCS, parents: [{id: id}]}).id);
  console.log(documentIds)
}
  • 在此脚本中,将返回创建的文档ID
  • 如果在您的实际情况下,此脚本的处理时间很长,请测试以下示例脚本2
示例脚本2: 在使用此脚本之前。在这个示例脚本中,使用Google Apps脚本库,使用驱动器API的批处理请求将新的Google文档创建到特定文件夹中。这样,任务将通过异步进程运行

请安装Google应用程序脚本库以使用批处理请求

注:
  • 对于上面的示例脚本,如果要检索特定文件夹下的文件夹ID,还可以使用For
    folderIds
    ,如下所示

      const topFolderId = "### top folder ID ###";
      const folders = DriveApp.getFolderById(topFolderId).getFolders();
      const folderIds = [];
      while (folders.hasNext()) {
        folderIds.push(folders.next().getId());
      }
    
      function createDoc(folderID, name) {
        var folder = DriveApp.getFolderById(folderID);
        var doc = DocumentApp.create(name);
        DriveApp.getFileById(doc.getId()).moveTo(folder);
        return doc;
      }
    
  • 顺便说一下,在当前阶段,要移动文件,可以使用。使用此选项,可以按如下方式修改的脚本

      const topFolderId = "### top folder ID ###";
      const folders = DriveApp.getFolderById(topFolderId).getFolders();
      const folderIds = [];
      while (folders.hasNext()) {
        folderIds.push(folders.next().getId());
      }
    
      function createDoc(folderID, name) {
        var folder = DriveApp.getFolderById(folderID);
        var doc = DocumentApp.create(name);
        DriveApp.getFileById(doc.getId()).moveTo(folder);
        return doc;
      }
    
参考资料:

什么意思
每隔一段时间运行
?@marios当你创建一个谷歌应用程序脚本时,你可以通过一个触发器设置它,使它每N分钟运行一次。嗨,示例脚本1正是我要找的,只是它不起作用。它爆炸是因为它不喜欢我传递的{id:folder.getId()}。注意,文件夹是动态找到的,所以我有v3代码,收集需要这个文件的文件夹有点复杂。我想知道这是否与一些v2/v3冲突有关。真的,为什么我不能用v3来做这个?奇怪的是,我不能简单地使用这里记录的Folder.createFile()调用:@Jack谢谢你的回复。对于给您带来的不便和我糟糕的英语水平,我深表歉意。不幸的是,我无法从你的回复中了解你目前的情况。因为当我测试示例脚本1时,没有发生错误。我为此道歉。为了正确了解您当前的情况,您能否提供当前的整个脚本来复制您的问题?@Jack因为从
注意,文件夹是动态找到的,所以我有一些复杂的v3代码来收集需要此文件的文件夹。
,我无法想象您当前的脚本。这是因为我的技术差。对此我深表歉意。你能合作解决你的问题吗?谢谢你的帮助,但是这个怎么样:给我看一下显示你如何获得文件夹id的代码。我的代码就是这样做的:{id:folder.getId()},这就爆炸了。我从V3API获得文件夹对象,代码很复杂,因为它正在寻找“正确”的文件夹来添加此文件。我得到的错误是“找不到文件”,它会打印id,这确实是文件夹的id。@杰克,谢谢你的回复。我不得不为我糟糕的英语水平道歉。很遗憾,我无法理解你的答复。但是从你的回复中,我了解到你没有使用与我提议的脚本相同的脚本。那么你能提供你当前的脚本吗?如果你能做到,请把它添加到你的问题中。通过这一点,我想确认一下。如果你能合作解决你的问题,我很高兴。你能合作做这件事吗?但如果我误解了你的回答,我道歉。