【问题标题】:Trying to create a Google Drive Script to copy and move files尝试创建 Google Drive 脚本来复制和移动文件
【发布时间】:2020-01-27 17:31:08
【问题描述】:

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

我的问题:我的公司确实为许多其他公司工作(例如随附的云端硬盘层次结构照片)。与我们合作的每家公司都有自己的文件夹,该文件夹嵌套在“其他公司的衬衫”文件夹下。我们将他们所有的资产放入这些文件夹中(徽标、模型、报价单)。

我们想要构建一个脚本,该脚本将查看各个公司文件夹并获取开始以单词Mock的任何文件,并自动将其复制并放入database folder中找到下图。

这是到目前为止的脚本。但我无法进入子文件夹 (ford tshirts and designs)。不仅如此,如果它每天运行,脚本将继续复制它在过去复制的文件,这是我想要避免的。

脚本:

Function getTheFiles() {

	var dApp = DriveApp;
	var folderIter = dApp.getFolderByName("Shirts for other companies");
	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();
		
		if(filename = "mocking") {
			file.makeCopy(dataBase);
		}

		logger.log(filename);
		i++;
	}

【问题讨论】:

  • 您可能希望使用 this 之类的东西来递归浏览文件夹
  • 好吧,我会研究一下,不过可能超出我的水平。
  • 思考比写作更难。
  • 您实际上并不需要复制文件并将它们移动到另一个文件夹中,您真正需要做的就是访问它们以某种合乎逻辑的方式将它们的 URL 存储在电子表格中,并在您单击它们时单击它们想要打开它们。

标签: javascript google-apps-script google-drive-api


【解决方案1】:

如果我的理解正确,你想:

  • 将所有文件从名为“其他公司的衬衫”的文件夹中的不同子文件夹中复制到 mock 开头的文件夹中的所有文件到 Database folder(也在主文件夹中)。
  • 避免文件被多次复制。

如果是这种情况,您可以执行以下操作:

  • 在主文件夹的每个子文件夹中搜索以mock 开头的所有文件,不包括Database folder 内的文件。为此,您遍历每个子文件夹中的所有文件(在检查子文件夹未命名为Database folder 之后。对于每个文件,您使用substring 方法检查名称是否以mock 开头。
  • 要跟踪复制了哪些文件并避免重复,您可以使用PropertiesService,它可以存储键值对。每个复制文件的 id 都被复制到脚本属性中,然后,下次脚本运行时,它会检查 id 是否在属性中。如果是这种情况,则不会再次复制该文件。需要注意的一点是脚本属性只能存储字符串,因此每次我们想要存储新的 id 时都必须将数组转换为字符串(通过toString,然后通过split返回数组。

下面的函数做了所有这些事情(查看内联 cmets 了解更多详情):

function copyFiles() {
  var mainFolder = DriveApp.getFoldersByName("Shirts for other companies").next();
  var folders = mainFolder.getFolders(); // Get folder iterator from main folder 
  var databaseFolderName = "Database folder"; // You database folder name
  var databaseFolder = mainFolder.getFoldersByName(databaseFolderName).next(); // Get databse folder
  var idsArray = []; // Array to store the ids of the copied files
  while (folders.hasNext()) { // Iterate through each folder in the main folder
    var folder = folders.next();
    if (folder.getName() !== databaseFolderName) { // Check current folder is not the database folder
      var files = folder.getFiles();
      while (files.hasNext()) { // Iterate through each file in each subfolder
        var file = files.next();
        if (file.getName().substring(0, 4).toLowerCase() === "mock") { // Check that file name starts with "mock"
          // Get ids of the files that were copied in previous executions:
          var key = "copied-ids";
          var scriptProperties = PropertiesService.getScriptProperties();
          var ids = scriptProperties.getProperty(key);
          if (ids) idsArray = ids.split(",");
          else ids = "";
          // Get current file id:
          var id = file.getId();
          // Check that current file id is not in properties (not copied before):
          if (idsArray.indexOf(id) === -1) {
            file.makeCopy(databaseFolder); // Copy file to database folder
            idsArray.push(id); // Add file id to the array of copied files
          }
          ids = idsArray.toString();
          scriptProperties.setProperty(key, ids);
        }
      }
    }
  }
}

参考:

希望对你有帮助。

【讨论】:

  • 对于任何延误,我深表歉意。不要经常登录。我真的很感激帮助!我今天会处理这个。希望我能弄清楚。无论哪种方式,我都非常感谢您的帮助。
【解决方案2】:

此功能将在您的整个 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--;
}

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多