将 onEdit 与 Google Sheets shared Spreadsheet 一起使用,它从一个 sheet 收集信息并在另一个 sheet 中设置值,同时限制其他用户
Using onEdit with a Google Sheets shared Spreadsheet that Collects info from one sheet and setsValue in another sheet while limiting the Other users
我有时间 Out/Time 在脚本中我已经工作了几个星期了。我很新,所以需要大量的研究和帮助。现在脚本按预期工作,但我想专门使用 Google 表格与其他帐户共享 sheet。这个想法是一台计算机将成为主机,并且只需要 sheets 来收集数据。另一台计算机将具有,我们称它们为客户通过 C 列中的下拉菜单或在 C 列中键入位置来单击位置。仅当 C 列在 ACTIVE sheet 上编辑时,onEdit 功能才会激活。(sheet 旨在供客户使用)在他们更改任何内容后,如果 C 列等于某些内容,则 onEdit 使用然后启动另一个将信息插入 PASSIVE sheet 的函数。(sheet 收集数据)问题我面临的是我不希望客户端计算机能够在被动 sheet 中编辑任何内容。我这样做的一种方法是使用 Google 表格来保护 PASSIVE sheet 不受其他用户的影响,但是当我这样做时,每次他们编辑 C 列时,该功能都不会发挥作用。可能是因为脚本无法插入受保护的 sheet?我认为会发生的情况是,通过在客户端计算机上编辑 C 列,它也会在主机上编辑 C 列,并且 onEdit 功能将在主机上激活。但显然 onEdit 功能只有在手动编辑时才会激活,通过脚本设置值不会削减它。我错了吗?
我做的另一件事是隐藏 PASSIVE sheet 但保持可编辑状态,这可行,但他们仍然可以单击查看并再次显示它。有没有办法防止这种情况?
我正在尝试使此脚本在客户端计算机上牢不可破。
这里有几行代码向您展示了我的意思。
function onEdit(e) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var row = getCurrentRow()
var Location = getValue('ACTIVE!C' + row)
var firstName = getValue('ACTIVE!A' + row)
var lastName = getValue('ACTIVE!B' + row)
var passiveRow = findRows(1,firstName,2,lastName,5,"",'PASSIVE');
if(SpreadsheetApp.getActiveSheet().getName() !== "ACTIVE") return;
if(Location !== 'OFFICE' && Location !== "" && passiveRow !== "") {
timeIn();
places();
Logger.log(passiveRow)
}
else if(Location !== 'OFFICE' && Location !== "" && passiveRow == "") {
places();
Logger.log(passiveRow)
}
else if(Location === 'OFFICE') {
timeIn();
}
}
"findRows" 函数是在 PASSIVE 脚本中找到符合条件的行并为我提供行以便放置 TimeIn 函数的函数。
最后,我不在乎使用什么方法,也许有更好的方法我没有想到。一种防止客户编辑被动 sheet 的方法,但他们仍然可以编辑主动 sheet 并且代码将 运行 正确。
我们 运行 在我的工作场所使用类似的登录/注销系统。我们是这样做的:
不使用简单的 onEdit() 触发器,而是在客户端上使用可安装的编辑触发器 sheet(通过项目当前触发器菜单选项)。使用您的帐户执行此操作。
创建不同的主机传播sheet。 (客户端gmail账户不需要对主机spreadsheet的编辑权限。)
- 让客户端的功能sheet将所需的信息附加到传播的主机sheet。
示例代码:
function onEdited() {
SpreadsheetApp.openById("host spreadsheet id").appendRow(["this function
ran"]);
}
- 与客户分享客户sheet。当他们进行更改时,您的函数将 运行 并更新主机 spreadsheet.
请注意,如果您的编辑功能需要客户端对 运行 的任何用户权限(例如获取会话信息),它将不会启动,因此请使用简单的 "I ran" 消息进行测试并运行您的到达你需要去的地方。
我有时间 Out/Time 在脚本中我已经工作了几个星期了。我很新,所以需要大量的研究和帮助。现在脚本按预期工作,但我想专门使用 Google 表格与其他帐户共享 sheet。这个想法是一台计算机将成为主机,并且只需要 sheets 来收集数据。另一台计算机将具有,我们称它们为客户通过 C 列中的下拉菜单或在 C 列中键入位置来单击位置。仅当 C 列在 ACTIVE sheet 上编辑时,onEdit 功能才会激活。(sheet 旨在供客户使用)在他们更改任何内容后,如果 C 列等于某些内容,则 onEdit 使用然后启动另一个将信息插入 PASSIVE sheet 的函数。(sheet 收集数据)问题我面临的是我不希望客户端计算机能够在被动 sheet 中编辑任何内容。我这样做的一种方法是使用 Google 表格来保护 PASSIVE sheet 不受其他用户的影响,但是当我这样做时,每次他们编辑 C 列时,该功能都不会发挥作用。可能是因为脚本无法插入受保护的 sheet?我认为会发生的情况是,通过在客户端计算机上编辑 C 列,它也会在主机上编辑 C 列,并且 onEdit 功能将在主机上激活。但显然 onEdit 功能只有在手动编辑时才会激活,通过脚本设置值不会削减它。我错了吗?
我做的另一件事是隐藏 PASSIVE sheet 但保持可编辑状态,这可行,但他们仍然可以单击查看并再次显示它。有没有办法防止这种情况?
我正在尝试使此脚本在客户端计算机上牢不可破。
这里有几行代码向您展示了我的意思。
function onEdit(e) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var row = getCurrentRow()
var Location = getValue('ACTIVE!C' + row)
var firstName = getValue('ACTIVE!A' + row)
var lastName = getValue('ACTIVE!B' + row)
var passiveRow = findRows(1,firstName,2,lastName,5,"",'PASSIVE');
if(SpreadsheetApp.getActiveSheet().getName() !== "ACTIVE") return;
if(Location !== 'OFFICE' && Location !== "" && passiveRow !== "") {
timeIn();
places();
Logger.log(passiveRow)
}
else if(Location !== 'OFFICE' && Location !== "" && passiveRow == "") {
places();
Logger.log(passiveRow)
}
else if(Location === 'OFFICE') {
timeIn();
}
}
"findRows" 函数是在 PASSIVE 脚本中找到符合条件的行并为我提供行以便放置 TimeIn 函数的函数。
最后,我不在乎使用什么方法,也许有更好的方法我没有想到。一种防止客户编辑被动 sheet 的方法,但他们仍然可以编辑主动 sheet 并且代码将 运行 正确。
我们 运行 在我的工作场所使用类似的登录/注销系统。我们是这样做的:
不使用简单的 onEdit() 触发器,而是在客户端上使用可安装的编辑触发器 sheet(通过项目当前触发器菜单选项)。使用您的帐户执行此操作。
创建不同的主机传播sheet。 (客户端gmail账户不需要对主机spreadsheet的编辑权限。)
- 让客户端的功能sheet将所需的信息附加到传播的主机sheet。 示例代码:
function onEdited() {
SpreadsheetApp.openById("host spreadsheet id").appendRow(["this function
ran"]);
}
- 与客户分享客户sheet。当他们进行更改时,您的函数将 运行 并更新主机 spreadsheet.
请注意,如果您的编辑功能需要客户端对 运行 的任何用户权限(例如获取会话信息),它将不会启动,因此请使用简单的 "I ran" 消息进行测试并运行您的到达你需要去的地方。