与特定人群共享 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。
感谢您的帮助。
我相信你的目标如下。
- 您想将最后一行(“A”到“J”列)复制到创建的跨页的第一个选项卡sheet。
- 您想与从活动 Spreadsheet 中“Sheet2”的“B”列检索到的电子邮件共享活动 Spreadsheet 和创建的 Spreadsheet。
- 您想通过可安装的 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());
}
我有一个应用程序脚本,每次在 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。 感谢您的帮助。
我相信你的目标如下。
- 您想将最后一行(“A”到“J”列)复制到创建的跨页的第一个选项卡sheet。
- 您想与从活动 Spreadsheet 中“Sheet2”的“B”列检索到的电子邮件共享活动 Spreadsheet 和创建的 Spreadsheet。
- 您想通过可安装的 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());
}