将 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" 消息进行测试并运行您的到达你需要去的地方。