google-apps-script - 我编写了一个脚本将文件复制到备份文件夹,但独立的 webapp 文件被复制到根目录
问题描述
有谁知道为什么会这样?将所有文件复制到目的地会更方便。我有一个文件名列表和文件 ID 3 是电子表格,一个是我部署为 web 应用程序的独立脚本。三个电子表格去正确的地方。独立的 webapp 进入根目录。我不认为它是重复的建议。
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 的“更新”方法修改了您的脚本。复制文件时,该脚本的流程如下。
- 使用 复制文件
makeCopy()
。 - 如果文件的 mimeType 是 Google Apps Script,则
subFldr
使用 Drive API 的“更新”方法移动文件。 - 如果文件的 mimeType 不是 Google Apps Script,则不使用“更新”方法。
修改后的脚本:
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');
}
笔记 :
- 在这个修改后的脚本中,使用了 Advanced Google Services 的 Drive API。所以请在高级谷歌服务和 API 控制台启用 Drive API。对于 Advanced Google Services,Drive API 的版本是 v2。
- 您可以在此处查看如何启用 Drive API 。
参考 :
推荐阅读
- python - 保存为 pdf 时指定的颜色看起来不同
- jquery - JQuery点击事件未在Firefox中触发
- apache-spark - 使用查找表中的 withColumn 动态添加新列
- flutter - 我想使用颤振制作生日提醒通知
- java - Apache PdfBox如何设置字段字体大小
- vim - Vim 插件 youcompleteme: 无法启动 Ycm Server / YcmToggleLogs 无显示
- python - 如何在 Python 中获取或打印 GMT 时区的当前日期时间?
- r - 在闪亮的应用程序中插入 dygraph 的问题
- ruby-on-rails - 如何摆脱本地 heroku 遥控器或应用程序?
- solr - 如何在 SOLR 中获取每个文档的总字数?