想要在google驱动器中新建的模板文件夹link通过apps脚本添加到googlesheet的特定单元格中

Want the link of the newly created template folder in google drive to add in the specific cell of google sheet through apps script

每当我将新客户端添加到 sheet 到 HTML 表单时,我有一个脚本可以在驱动器中创建客户端的文件夹、子文件夹和 sheet。我正在寻找一种方法来为新创建的文件夹在 K 列中添加 link,并将 link 共享到具有编辑权限的客户端电子邮件中的该文件夹。

这是在驱动器中添加模板文件夹的代码。顺便说一句,我是应用程序脚本的新手。所以我只是在学习和接受专家的指导。热烈感谢任何帮助。

function createClientAccountFolder(clientNamefolder, costingSheetId, ProposalDocId, renamesheet) {
  // This is the root directory where all the client folders would be stored
  const customerRoot = DriveApp.getFolderById('folder_id');

 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var databaseSheet = ss.getSheetByName("Clients");
 var lastAvailableRow = databaseSheet.getLastRow();
 const clientName = databaseSheet.getRange(lastAvailableRow, 2).getValue();

 if (clientNamefolder) {
  // This creates the main folder with the customer name
  const clients_sheet = ss.getRange("K2:K" + lastAvailableRow);
  const mainFolder = customerRoot.createFolder(clientNamefolder);
  var folder_url = mainFolder.getUrl();

  // have tried a way to add the link in cell
  clients_sheet.setFormula('=HYPERLINK("' + mainFolder.getUrl() + '")');

  

  // Creating the sub folders
  // Some are assigned to variables so that later children can be added
  const action_tracker =  mainFolder.createFolder("[SEO] - Action Tracker [" + clientNamefolder + "]")
  const audit =  mainFolder.createFolder("[SEO] - Audits [" + clientNamefolder + "]")
  

  // Creating children
  content.createFolder("[" + clientName +  "] Content Approved")
  content.createFolder("[" + clientName +  "] Content Draft")


  // Getting the documents
  const action_tracker_sheet = DriveApp.getFileById('Sheet_id')
  const analytics_audit = DriveApp.getFileById('Sheet_id')


  // Moving the documents to the respective folders
  const moved_action_tracker_sheet = action_tracker_sheet.moveTo(action_tracker)
  const moved_analytics_audit = analytics_audit.moveTo(audit)
 
  // renamin sheets
  moved_action_tracker_sheet.SpreadsheetApp.getActiveSpreadsheet().rename(clientName + " Action Tracker");
  moved_analytics_audit.SpreadsheetApp.getActiveSpreadsheet().rename(clientName + " Analytics Audit");


 } else {
   Logger.log('No Client Name Specified')
 }
}

终于触发添加文件夹、子文件夹和sheets的功能。

function test(){
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var databaseSheet = ss.getSheetByName("Clients");
 var lastAvailableRow = databaseSheet.getLastRow();
 const clientName = databaseSheet.getRange(lastAvailableRow, 2).getValue();
 createClientAccountFolder(clientName, "[SHEET_ID]", "[DOC_ID]")
}

我想让您意识到您正试图将同一文件夹 link 添加到 sheet 中的多个单元格。我不知道这是否有目的,但我认为您可能想要更改该范围。无论如何,我建议的解决方案使用 RichTextValue 对象,因此您不必使用公式。你会想要改变

clients_sheet.setFormula('=HYPERLINK("' + mainFolder.getUrl() + '")');

var richText = SpreadsheetApp.newRichTextValue().setText("Folder URL").setLinkUrl(folder_url).build();
clients_sheet.setRichTextValue(richText);

主要问题及解决方案:

  • 如果只想显示link,不需要加公式,直接通过Range.setValue(folderUrl).
  • 设置值即可
  • 如果您希望显示的文本与 link 本身不同,请使用 , via RichTextValue 中采用的方法。
  • 您只想设置单个单元格(最后一行的 K 列)的值。因此,您的范围不应包含多个单元格,如您当前的代码 ("K2:K" + lastAvailableRow),而是一个单元格,如 "K" + lastRow.
  • 要与具有编辑权限的电子邮件地址共享文件夹,请使用 Folder.addEditor(emailAddress)

代码示例:

function addLinkAndShare() {
  const customerRoot = DriveApp.getFolderById('folder_id');
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const databaseSheet = ss.getSheetByName("Clients");
  const lastRow = databaseSheet.getLastRow();
  const clientName = databaseSheet.getRange(lastRow, 2).getValue();
  if (clientName) {
    const mainFolder = customerRoot.createFolder(clientNameFolder);
    const folderUrl = mainFolder.getUrl();
    databaseSheet.getRange("K" + lastRow).setValue(folderUrl);
    const clientEmail = databaseSheet.getRange("J" + lastRow).getValue();
    mainFolder.addEditor(clientEmail);
    /*
    / Creating subfolders, renaming, etc. (unrelated to your question)
    */
  } else {
    Logger.log('No Client Name Specified')
  } 
}

其他问题和改进:

我建议您创建文件夹,添加文件夹 URL 并在将数据附加到 sheet 的同一脚本中共享它,然后再执行此操作。这样,您可以一次添加所有值,无需检索刚刚设置的值(例如 clientName),并且您将减少必要的调用量(参见 Minimize calls to other services) .

由于您没有提供与附加到 sheet 的数据相关的代码,所以我没有将其添加到上面的代码示例中。