与特定人群共享 google sheet 的 Apps 脚本

Apps script that shares a google sheet to a specific group of people

我有一个应用程序脚本,每次在 Master Sheet 的 sheet1 的 A 列中创建一个新条目时,它都会创建一个新的 Google 作品sheet并将新作品sheet 重命名为Master Sheet sheet1 的A 列中最后输入的数据。它还将新创建的 sheet 的 URL 粘贴到母版 sheet 的 sheet1 的 J 列中。下面是代码

function myFunction() {
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getActiveSheet();
  const nss = SpreadsheetApp.create(sh.getRange(sh.getLastRow(), 1).getDisplayValue())
  sh.getRange(sh.getLastRow(), 10).setValue(nss.getUrl());
}

应用程序脚本代码是 运行 由我手动设置的 onEdit 触发器。 每次创建一个新作品sheet,我希望将编辑的最后一行(从A到J)复制到新创建的作品sheet 我还希望每个作品sheet 主 sheet 和新创建的 sheet 与 Sheet 2 的 B 列中的电子邮件列表共享(作为编辑)大师sheet。 感谢您的帮助。

我相信你的目标如下。

  1. 您想将最后一行(“A”到“J”列)复制到创建的跨页的第一个选项卡sheet。
  2. 您想与从活动 Spreadsheet 中“Sheet2”的“B”列检索到的电子邮件共享活动 Spreadsheet 和创建的 Spreadsheet。
  3. 您想通过可安装的 OnEdit 触发器和手动执行来 运行 脚本。

修改点:

  • 在你的脚本中,
    • 不包括用于复制已编辑行的脚本。
    • 不包括共享 Spreadsheet 的脚本。
    • getLastRow()被使用了2次。这个可以用一次。

当这些点体现在你的脚本中,就变成了下面这样。

修改后的脚本:

a list of emails in Column B of Sheet 2 of the master sheet 开始,此修改后的脚本从活动 Spreadsheet 的“Sheet2”的“B”列中检索电子邮件。如果您的sheet名称不是“Sheet2”,请修改。

function myFunction() {
  // Creating new Spreadsheet.
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getActiveSheet();
  const lastRow = sh.getLastRow();
  const values = sh.getRange(`A${lastRow}:J${lastRow}`).getValues()[0];
  const nss = SpreadsheetApp.create(values[0]);
  const url = nss.getUrl();
  sh.getRange(lastRow, 10).setValue(url);
  values[9] = url;
  nss.appendRow(values);

  // Sharing Spreadsheets.
  const sheet2 = ss.getSheetByName("Sheet2");
  const emails = [...new Set(sheet2.getRange("B1:B" + sheet2.getLastRow()).getValues().reduce((ar, [b]) => {
    if (b && b.includes("@")) ar.push(b);
    return ar;
  }, []))];
  ss.getEditors().forEach(e => ss.removeEditor(e));
  ss.addEditors(emails);
  nss.addEditors(emails);
}
  • 当这个脚本是运行时,我认为上面你的预期流程是运行。
  • 在此修改后的脚本中,活动 Spreadsheet 通过更新用户与“Sheet2”的“B”列中的值共享。如果您不想这样做,请删除 ss.getEditors().forEach(e => ss.removeEditor(e));ss.addEditors(emails);.

参考文献:

建议:

这是脚本的一个版本,其中您的 Master Sheet - Sheet 1 的最后一行(列“A”到“J”)自动复制到新创建的电子表格。请参阅内联评论以了解所提供的更改。

function createNewSheet() {
  const ss = SpreadsheetApp.getActive();
  const sh = ss.getSheetByName('Sheet1');
  const nss = SpreadsheetApp.create(sh.getRange(sh.getLastRow(), 1).getDisplayValue());
  
  //Opens the newly created spreadsheet
  const ds = SpreadsheetApp.openById(nss.getUrl().substring(39, 83)).getActiveSheet(); 

  //Gets the value from the master spreadsheet's last row
  const dsval = sh.getRange(sh.getLastRow(), 1, 1, 10).getValues();

  //Sets the value to the first row of the newly created spreadsheet
  ds.getRange('A1:J1').setValues(dsval);

  sh.getRange(sh.getLastRow(), 10).setValue(nss.getUrl());
}