Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 试图创建一个Google驱动器脚本来复制和移动文件_Javascript_Google Apps Script_Google Drive Api - Fatal编程技术网

Javascript 试图创建一个Google驱动器脚本来复制和移动文件

Javascript 试图创建一个Google驱动器脚本来复制和移动文件,javascript,google-apps-script,google-drive-api,Javascript,Google Apps Script,Google Drive Api,我在编码方面很糟糕,所以我相信这需要一些工作 我的问题:我的公司确实为许多其他公司工作(附示例驱动器层次结构照片)。与我们合作的每个公司都有自己的文件夹,该文件夹嵌套在“其他公司衬衫”文件夹下。我们将其所有资产放入这些文件夹(徽标、模拟、报价) 我们希望构建一个脚本,该脚本将查看各个公司文件夹,并获取以单词Mock开头的文件,然后自动复制该文件并将其放入下图中的数据库文件夹中 这是到目前为止的脚本。但我在进入子文件夹(ford tshirts and Design)时遇到问题。不仅如此,如果它每

我在编码方面很糟糕,所以我相信这需要一些工作

我的问题:我的公司确实为许多其他公司工作(附示例驱动器层次结构照片)。与我们合作的每个公司都有自己的文件夹,该文件夹嵌套在“其他公司衬衫”文件夹下。我们将其所有资产放入这些文件夹(徽标、模拟、报价)

我们希望构建一个脚本,该脚本将查看各个公司文件夹,并获取以单词
Mock
开头的文件,然后自动复制该文件并将其放入下图中的
数据库文件夹中

这是到目前为止的脚本。但我在进入子文件夹(
ford tshirts and Design
)时遇到问题。不仅如此,如果它每天运行,脚本将继续复制它在过去复制的文件,这是我希望避免的

脚本:

函数getTheFiles(){ var-dApp=DriveApp; var folderIter=dApp.getFolderByName(“其他公司的衬衫”); var folder=folderIter.next(); var filesIter=folder.getFiles(); var dataBase=folder.getFoldersByName(“database1”).next(); var i=1; while(filesIter.hasNext()){ var file=filesIter.next(); var filename=file.getName(); 如果(filename=“mocking”){ makeCopy(数据库); } logger.log(文件名); i++;
}
此功能将搜索整个Google驱动器中以字母
Mock
开头的文件,并将名称、url、id、类型(文件夹或文件)放入活动电子表格和名为
MoclList
的选项卡中

function getAllMocks() {
  var ss=SpreadsheetApp.getActive();
  var sh1=ss.getSheetByName('MocksList');
  sh1.clearContents();
  sh1.appendRow(['Name','Url','Id','Type']);
  getFnF();
  SpreadsheetApp.getUi().alert('Process Complete')
}

var level=0;
function getFnF(folder) {
  var folder= folder || DriveApp.getRootFolder();
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('MocksList');
  var files=folder.getFiles();
  while(files.hasNext()) {
    var file=files.next();
    if(file.getName().toLowerCase().slice(0,4)=='mock') {
      var firg=sh.getRange(sh.getLastRow() + 1,level + 1);
      firg.setValue(file.getName());
      firg.offset(0,1).setValue(Utilities.formatString('=HYPERLINK("%s","%s")',file.getUrl(),'FILE: ' + file.getName()));
      firg.offset(0,2).setValue(file.getId());
      firg.offset(0,3).setValue('File');
    }
  }
  var subfolders=folder.getFolders() 
  while(subfolders.hasNext()) {
    var subfolder=subfolders.next();
    var forg=sh.getRange(sh.getLastRow() + 1,level + 1);
    forg.setValue(subfolder.getName());
    forg.offset(0,1).setValue(Utilities.formatString('=HYPERLINK("%s","%s")',subfolder.getUrl(),'FOLDER: ' + subfolder.getName()));
    forg.offset(0,2).setValue(subfolder.getId());
    forg.offsert(0,3).setValue('Folder');
    //level++;
    getFnF(subfolder);
  }
  //level--;
}

如果我理解正确,您希望:

  • 将名为“Shirts for other Companys”(以单词
    mock
    开头)的文件夹中不同子文件夹中的所有文件复制到
    数据库文件夹(也在主文件夹中)
  • 避免多次复制文件
如果是这种情况,您可以执行以下操作:

  • 搜索主文件夹中以
    mock
    开头的每个子文件夹中的所有文件,不包括
    数据库文件夹中的文件。为此,您需要遍历每个子文件夹中的所有文件(检查子文件夹是否未命名为
    数据库文件夹
    。对于每个文件,使用以下方法检查名称是否以
    mock
    开头
  • 要跟踪复制的文件,从而避免重复,可以使用,它可以存储键值对。每个复制文件的id都复制到脚本属性,然后,下次脚本运行时,它会检查id是否在属性中。如果是这样,则不会再次复制文件。需要注意的一点是该脚本属性只能存储字符串,因此每当我们要存储新id时,数组必须转换为字符串(通过,并返回到数组,通过)
下面的函数执行所有这些操作(有关更多详细信息,请查看内联注释):

函数copyFiles(){
var mainFolder=DriveApp.getFoldersByName(“其他公司的衬衫”).next();
var folders=mainFolder.getFolders();//从主文件夹获取文件夹迭代器
var databaseFolderName=“数据库文件夹”;//您需要数据库文件夹名称
var databaseFolder=mainFolder.getFoldersByName(databaseFolderName).next();//获取数据库文件夹
var idsArray=[];//用于存储复制文件的ID的数组
while(folders.hasNext()){//遍历主文件夹中的每个文件夹
var folder=folders.next();
如果(folder.getName()!==databaseFolderName){//请检查当前文件夹不是数据库文件夹
var files=folder.getFiles();
而(files.hasNext()){//遍历每个子文件夹中的每个文件
var file=files.next();
如果(file.getName().substring(0,4).toLowerCase()=“mock”){//检查文件名是否以“mock”开头
//获取以前执行中复制的文件的ID:
var key=“复制的ID”;
var scriptProperties=PropertiesService.getScriptProperties();
var id=scriptProperties.getProperty(键);
如果(ids)IDSRARY=ids.split(“,”);
else id=“”;
//获取当前文件id:
var id=file.getId();
//检查当前文件id是否不在属性中(之前未复制):
if(idsArray.indexOf(id)=-1){
file.makeCopy(databaseFolder);//将文件复制到数据库文件夹
idsArray.push(id);//将文件id添加到复制文件的数组中
}
ids=idsArray.toString();
setProperty(键,ID);
}
}
}
}
}
参考:

我希望这能有所帮助。

您可能会希望使用类似于在文件夹中递归的方法。我将研究这一点,但这可能超出了我的水平。思考比编写更难。您不需要复制文件并将其移动到另一个文件夹中。访问这些文件并将其URL存储在其中,您真正需要做的就是访问它们以某种合乎逻辑的方式创建电子表格,并在您想要打开它们时单击它们。对于任何延迟,我深表歉意。不要经常登录。我真的非常感谢您的帮助!我今天将处理此问题。希望我能解决它。无论哪种方式,我都非常感谢您的帮助。