google-apps-script - 我编写了一个脚本将文件复制到备份文件夹,但独立的 webapp 文件被复制到根目录

标签 google-apps-script google-sheets google-drive-api

有谁知道为什么会发生这种情况吗?将所有文件复制到目的地会方便得多。我有一个文件名和文件 ID 列表,其中 3 个是电子表格,一个是我部署为 Web 应用程序的独立脚本。这三个电子表格转到正确的位置。独立的 Web 应用程序会转到根目录。我不认为它是建议的重复项。

  function backUpProjectFiles(){
  var backupFolder=DriveApp.getFolderById(getGlobal('BackupDirId'));
  var subFldrName='BackUpFiles_' + Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyy-MM-dd_HH:mm:ss');
  var subFldr=backupFolder.createFolder(subFldrName);
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('BackUpFiles');
  var rg=sh.getDataRange();
  var vA=rg.getValues();//column1 is filenames column2 is file ids
  var s='<br />Files Backed Up:<br />';
  for(var i=1;i<vA.length;i++){
    var file=DriveApp.getFileById(vA[i][1]);
    file.makeCopy(vA[i][0],subFldr);
    s+=Utilities.formatString('%s FilePath:%s/%s/<strong>%s</strong><br />',i,backupFolder.getName(),subFldr.getName(),file.getName());
  }
  s+=Utilities.formatString('Total Files Copied: %s<br /><input type="button" value="Exit" onClick="google.script.host.close();" />',vA.length-1)
  var ui=HtmlService.createHtmlOutput(s).setWidth(600).setHeight(500);
  SpreadsheetApp.getUi().showModelessDialog(ui,'File Backup Complete');
}  

最佳答案

我使用 Drive API 的“更新”方法修改了您的脚本。当复制文件时,该脚本的流程如下。

  1. 使用 makeCopy() 复制文件。
  2. 如果文件的 mimeType 是 Google Apps 脚本,则使用 Drive API 的“更新”方法将文件移至 subFldr
  3. 如果文件的 mimeType 不是 Google Apps 脚本,则不会使用“更新”方法。

修改后的脚本:

function backUpProjectFiles(){
  var backupFolder=DriveApp.getFolderById(getGlobal('BackupDirId'));
  var subFldrName='BackUpFiles_' + Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyy-MM-dd_HH:mm:ss');
  var subFldr=backupFolder.createFolder(subFldrName);
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('BackUpFiles');
  var rg=sh.getDataRange();
  var vA=rg.getValues();//column1 is filenames column2 is file ids
  var s='<br />Files Backed Up:<br />';
  for(var i=1;i<vA.length;i++){
    var file=DriveApp.getFileById(vA[i][1]);

    var res = file.makeCopy(vA[i][0],subFldr); // Modified
    if (file.getMimeType() == MimeType.GOOGLE_APPS_SCRIPT) { // Added
      Drive.Files.update({"parents": [{"id": subFldr.getId()}]}, res.getId()); // Added
    }

    s+=Utilities.formatString('%s FilePath:%s/%s/<strong>%s</strong><br />',i,backupFolder.getName(),subFldr.getName(),file.getName());
  }
  s+=Utilities.formatString('Total Files Copied: %s<br /><input type="button" value="Exit" onClick="google.script.host.close();" />',vA.length-1)
  var ui=HtmlService.createHtmlOutput(s).setWidth(600).setHeight(500);
  SpreadsheetApp.getUi().showModelessDialog(ui,'File Backup Complete');
}

注意:

  • 在此修改后的脚本中,使用了高级 Google 服务的 Drive API。因此,请在高级 Google 服务和 API 控制台中启用 Drive API。对于高级 Google 服务,Drive API 的版本是 v2。
    • 您可以在here查看如何启用Drive API。 .

引用:

关于google-apps-script - 我编写了一个脚本将文件复制到备份文件夹,但独立的 webapp 文件被复制到根目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51959824/

相关文章:

google-apps-script - 如何在 Google Apps 脚本中定义全局变量

function - 在谷歌驱动器上,文件夹是否存在总是返回 false

google-apps-script - Google 电子表格脚本 - 如何测试单元格是否为粗体

android - 使用已弃用的方法解决 GoogleAccountCredential.RequestHandler

javascript - Google Apps 脚本 Web 应用程序刷新

google-apps-script - 带有 script.google.run 的 Apps 脚本参数

google-apps-script - 使用 Google Apps 脚本删除列中重复单元格的行

javascript - 谷歌脚本循环复制到循环行

authentication - Google Apps 脚本授权错误

XPath 将元素中的所有文本作为一个值获取,删除换行符