0

我想通过 Google 表格中的脚本在 Google Drive 中创建一些文件夹,然后获取新文件夹的 URL 以将它们放入单元格中。

我成功地根据“员工 ID”列创建了文件夹,并用文件夹超链接替换了“员工 ID”列的值。

所以我得到了在 Google Drive 中创建的 3 个文件夹:分别为 1,2 和 3。问题是我的代码在 Google 表格的每一行中重复相同的名称和 URL,设置创建的最后一个文件夹的名称和 URL(在本例中为文件夹 3)。

如果您能给我一些帮助,我将不胜感激。这是我的代码:

function onEdit(e) {
if ([1, 2,].indexOf(e.range.columnStart) != 1) return;
createEmployeeFolder();
}

function createEmployeeFolder() {
var parent = DriveApp.getFolderById("1H0i69rE9WO0IAoxhnrFY2YKT_tD50fuX")
SpreadsheetApp.getActive().getSheetByName('Database').getRange('B3:B').getValues()
    .forEach(function (r) {
        if(r[0]) checkIfFolderExistElseCreate(parent, r[0]);
    })
}

function checkIfFolderExistElseCreate(parent, folderName) {
var folder;
var idfolder;
var link;
try {
    folder = parent.getFoldersByName(folderName).next();
} catch (e) {
    folder = parent.createFolder(folderName);
    idfolder = folder.getId();
    link = folder.getUrl();
    formula = '=hyperlink("' + link + '",' + folder + ')';
  SpreadsheetApp.getActive().getSheetByName('Database').getRange('B3:B').setFormula(formula); 
}
}

好的,我为此更改了代码。我可以创建文件夹,但问题在于SetFormula我无法使其工作以读取每一行以将 ID 替换为 URL。它只取最后一个 ID,然后在该范围内的所有行中重复相同的 ID。请帮忙!:P

 function createEmployeeFolder() {
var parent = DriveApp.getFolderById("1H0i69rE9WO0IAoxhnrFY2YKT_tD50fuX")
SpreadsheetApp.getActive().getSheetByName('Database').getRange('B3:B').getValues()
    .forEach(function (r) {
        if(r[0]) createFolder(r[0]);
    })
}

function createFolder(folderName) {

  var parent = DriveApp.getFolderById("1H0i69rE9WO0IAoxhnrFY2YKT_tD50fuX");

  var projectFolder;

  if (parent.getFoldersByName(folderName).hasNext()) {
    // folder already exists
    Folder = parent.getFoldersByName(folderName).next(); 
  } else {
    Folder = parent.createFolder(folderName);

  }
    var id = Folder.getId();
    var link = Folder.getUrl();
    var formula = '=hyperlink("' + link + '",' + Folder + ')';
    SpreadsheetApp.getActive().getSheetByName('Database').getRange('B3:B').setFormula(formula);
    return formula;

}
4

3 回答 3

0

我有一个功能可以为我做这件事。它接受一个用户名并返回一个公式,用于指向已存在或已创建的文件夹的链接。可以使用 setFormula() 将此链接放入单元格中:

function createUserFolder(userName) {

  var parent = DriveApp.getFolderById("1H0i69rE9WO0IAoxhnrFY2YKT_tD50fuX");

  if (parent.getFoldersByName(userName).hasNext()) {
    // folder already exists
    userFolder = parent.getFoldersByName(userName).next(); 
  } else {
    userFolder = parent.createFolder(userName);
  }

  var id = userFolder.getId();
  var formula = '=HYPERLINK("https://drive.google.com/open?id=' + id + '","Files")'

  return formula;

}

但是请注意,您应该非常彻底地重新考虑您的代码。电子表格中的每一次更改都会调用 onEdit,这是非常浪费的。遍历 B 列中的每个单元格是非常浪费的。在尝试执行关键代码时使用 catch 子句是个坏主意。

我会在工作表中添加一个对话框或其他 ui 来触发文件夹的创建,而不是持续监控工作表。

于 2018-06-22T15:23:55.177 回答
0

您的问题源于不完整的重构 - 您将获取文件夹 id 的任务拆分为一个单独的方法,但还将设置超链接的任务拆分为该 - 不Range知道的代码。

在所有其他行中重复最后一个值的解决方案是修复您的重构 - 设置公式应该在要写入的范围已知的地方完成。

function createEmployeeFolder() {
  const parent = DriveApp.getFolderById("some id");
  const sheet = SpreadsheetApp.getActive().getSheetByName('Database');
  const range = sheet.getRange(3, 2, sheet.getLastRow() - 2);
  range.getValues().forEach(function (row, index) {
    // Consider checking if this r & c has a formula in the equal size array from getFormulas()
    if(row[0]) {
      var newLink = getLinkForFolderName_(parent, row[0]);
      // Use the current array index to write this formula in only the correct cell.
      range.offset(index, 0, 1).setFormula(
        "=hyperlink(\"" + newLink + "\", \"" + row[0] + "\")";
      );
    }
  });
}

function getLinkForFolderName_(root, name) {
  var folder;
  const search = root.getFoldersByName(name);
  if (search.hasNext()) {
    folder = search.next();
    if (search.hasNext())
      console.warn("Multiple folders named '" + name + "' in root folder '" + root.getName() + "'");
  }
  else
    folder = root.createFolder(name);

  return folder.getUrl();
}

您应该取消onEdit简单触发器绑定,因为简单触发器无法创建文件夹(您需要为此授权) - 只需更改名称并安装on edit新名称的触发器即可。另一种选择是使用调用此函数的菜单选项。但是,使用已安装触发器的一个(可能)好处是所有文件夹都将归同一个帐户所有。

于 2018-06-26T13:00:02.310 回答
0

解决方案:

以下脚本在驱动器中创建一个文件夹,并自动在单元格中创建一个带有文件夹名称的链接。

function createAndHyperlink() {
    var ss, sh, parent, parent2, r, v, thisCell, folder
    ss = SpreadsheetApp.getActive()
    sh = ss.getSheetByName('INSERTTHENAMEOFYOURSHEETHERE')
    parent = DriveApp.getFileById(ss.getId()).getParents().next();
    parent2 = DriveApp.getFolderById("INSERT-YOURGOOGLEDRIVEFOLDERIDEHERE")
    r = sh.getRange('B3:B')
    v = r.getValues()
    for (var i = 0, l = v.length; i < l; i++) {
        thisCell = sh.getRange(i + 3, 2)
        if (v[i][0] && !thisCell.getFormula()) {
            folder = parent2.createFolder(v[i][0]);
            thisCell.setFormula('=HYPERLINK("' + folder.getUrl() + '"; "' + v[i][0] + '")');
        }
    }
}
于 2018-06-22T19:04:57.620 回答