在云端硬盘中创建新文件夹(如果尚不存在)

Gon*_*alo 3 google-sheets google-apps-script google-drive-api

语境

在我的云端硬盘中有以下结构:

Ops 文件夹 || 销售文件夹

Ops包含3个文件夹:Process1 / Process2 / Process3

Sales 包含 3 个文件夹:Customer1 / Customer2 / Customer3

目标

我要求提供“云端硬盘”>“销售”中的文件夹名称

在一张表中,我有一些潜在客户的姓名列表。我正在一一检查潜在客户的名称是否与我的云端硬盘中的任何文件夹匹配。

如果存在与潜在客户名称匹配的文件夹,则无需执行任何操作。

如果该潜在客户没有文件夹,我想在销售中使用潜在客户名称创建一个新文件夹

function prepararPropuesta() {

  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var ssAS = ss.getActiveSheet()
  var ssProspects = ss.getSheetByName('Prospects')

  var lr = ssProspects.getLastRow()
  var lc = ssProspects.getLastColumn()  



  // I'm looking for the column 'Prospect' in the Sheet
  for(i=2; i<lc; i++){  

    var columnas = ssProspects.getRange(2, i).getValue()
    Logger.log(columnas)

  if(columnas == 'Nombre Prospect'){

     var colProspect = ssProspects.getRange(2, i).getColumn()
     Logger.log(colProspect)
  }
  }


/*
     Now I'm looking for the names of the folders in my Drive
     This is looking in all my Drive. It would be nice to filter the 
search and look just in SubFolders(Sales)
*/
   var folders = DriveApp.searchFolders('"me" in owners');
    while (folders.hasNext()) {
   var folder = folders.next();
   Logger.log(folder.getName());

/*       The first Prospect Name is in row 2 and I'm creating a loop to 
get each Name 
         If the name matches an existing Folder then ends the function
         If the Prospect Name is not found in the Folders list then creates a new Folder under the name prospectName
*/
      for(i=2; i<lr; i++){
      var prospectName = ssProspects.getRange(i, colCliente).getValue()

            var folderName = folder.getName()
            if(folderName = prospectName){

              return

            }  
      }


      DriveApp.createFolder(prospectName)


}
}
Run Code Online (Sandbox Code Playgroud)

在代码的行与行之间,您将找到一步一步的描述

(1) 我正在找到潜在客户姓名所在的列 -> 这工作正常

(2) 我正在使用 WHILE 获取我的 Drive This 日志中的所有名称文件夹

Logger.log(folder.getName())
Run Code Online (Sandbox Code Playgroud)

退货

[18-04-21 06:33:35:985 PDT] 文件夹迭代器

名称正确吗?

(3) 我创建了变量folderName 和prospectName 并循环它们以检查是否存在匹配 -> 这部分无法正常工作。我想虽然我在developers.google中进行了研究,但我没有使用正确的方法。怎么可能呢?

谢谢!

JPV*_*JPV 5

在循环内使用 .getValue() 不是一个好主意,因为在这种情况下,您会对电子表格的每一行进行一次调用。在一次调用中获取所有值,然后在脚本中处理返回的数组被认为是一种很好的做法。

我不确定为什么需要循环遍历列才能找到具有该名称的列?假设您知道该列是什么,您可以直接获取该列的值(名称)。

以下示例假定“Prospects”工作表 B 列中的名称(更改范围以适应)。对于找到的每个名称,都会调用函数 checkIfFolderExistElseCreate()。该函数检查具有该名称(第二个参数)的文件夹是否存在。如果是这样,则不会发生任何事情,否则会创建具有该名称的文件夹。

该函数的第一个参数是将在其中创建新文件夹的“父”文件夹。

function prepararPropuesta() {
var parent = DriveApp.getFolderById("id_of_parentFolder")
SpreadsheetApp.getActive().getSheetByName('Prospects').getRange('B2:B').getValues()
    .forEach(function (r) {
        if(r[0]) checkIfFolderExistElseCreate(parent, r[0]);
    })
}

function checkIfFolderExistElseCreate(parent, folderName) {
var folder;
try {
    folder = parent.getFoldersByName(folderName).next();
} catch (e) {
    folder = parent.createFolder(folderName);
}
}
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助?

  • .getFoldersByName 返回一个folderIterator。Next 获取集合文件夹中的下一个项目。如果不存在具有该名称的文件夹,这将返回错误。在这种情况下,我们知道不存在这样的文件夹。try/catch 语句用于捕获错误(以便脚本不会停止执行)并创建文件夹。另请参阅:https://developers.google.com/apps-script/reference/drive/folder-iterator (3认同)