【问题标题】:My Script works for some people but not others我的脚本适用于某些人,但不适用于其他人
【发布时间】:2019-11-20 15:42:05
【问题描述】:

我在使用多个脚本的 Google 表格中创建了一个审核模板。该脚本旨在在用户单击复选框时使用活动用户的电子邮件和时间戳填充单元格。该脚本有效,除了一个人,该脚本无法识别他的活动用户电子邮件。谁能告诉我为什么该脚本适用于某些人而不适用于其他人以及我该如何解决它?

我已经在一个空白的测试电子表格中测试了脚本,它适用于这个人。我们在另一个 Google 表格中遇到了同样的问题,但我们通过创建一个新的电子表格并复制所有选项卡和脚本来解决这个问题。但是,尝试对这个电子表格做同样的事情失败了。

这是我的脚本:

function onEdit(e) {  //this is the event Google Sheets fires when cells are changed
var email = Session.getActiveUser().getEmail(); // Get the email address of the person running the script.
var date = new Date();
var spreadsheet = SpreadsheetApp.getActive();
 if (e.source.getActiveSheet().getName() == "InterimTestsOfControls") {   //only do this if the changed cell is on the specific worksheet you care about
  switch (e.range.getA1Notation()) {  //This gets the cell that was edited
    case "E5":                        //and this switch statement allows you to only respond to the cells you care about
      if (e.value == "TRUE") {
        SpreadsheetApp.getActiveSheet().getRange("F5").setValue("Prepared by " + email + " " + date);
        Logger.log(email);
        spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Audit Planning'), true).getRange('C7').activate().setValue(email);
        spreadsheet.setActiveSheet(spreadsheet.getSheetByName('InterimTestsOfControls'), true).getRange('C5').activate();
      }
      else {
        SpreadsheetApp.getActiveSheet().getRange("F5").setValue("Click box to sign-off as preparer");
        Logger.log(email);
        spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Audit Planning'), true).getRange('C7').activate().setValue("");
        spreadsheet.setActiveSheet(spreadsheet.getSheetByName('InterimTestsOfControls'), true).getRange('C5').activate();
      }
    }
  }
}

【问题讨论】:

  • 请使用代码示例功能并格式化脚本以便我们看清楚。

标签: google-apps-script google-sheets


【解决方案1】:

来自官方Session class 文档:

getActiveUser()

获取有关当前用户的信息。 如果安全策略不允许访问用户的身份,User.getEmail() 返回一个空白字符串。

这种情况可能在许多不同的情况下发生:

  • 用户的电子邮件地址在任何允许脚本在未经用户授权的情况下运行的上下文中均不可用,例如 简单 onOpen(e)onEdit(e) 触发器,Google 表格中的自定义函数,或部署为“以我身份执行”(即由开发人员而非用户授权)的网络应用。
  • 如果开发者自己运行脚本或与用户属于同一个 G Suite 域,则这些限制通常不适用。

在您的情况下,我看到您使用的是简单的onEdit(e) 触发器 - 所以看起来这可能是问题所在。您可能想改为查看Installable triggers

【讨论】:

    【解决方案2】:
    function onEdit(e) {  
      var sh=e.range.getSheet();
      var email = Session.getActiveUser().getEmail(); //This is a permissions issue.  You may have to use an installable trigger and even then it's not guaranteed
      var date = new Date();//you might want to use Utilities.formatDate()
      //var spreadsheet = SpreadsheetApp.getActive();this is than same as e.source
      if (sh.getName()=="InterimTestsOfControls") {  
        //you can selection your cells with information that's already in the event block rather than having to run another function
        if(e.range.columnStart==6 && e.range.rowStart==5) {
          if (e.value=="TRUE") {
            sh.getRange("F5").setValue("Prepared by " + email + " " + date);
            e.source.getSheetByName('Audit Planning').getRange('C7').setValue(email);
          } else {
            e.source.getRange("F5").setValue("Click box to sign-off as preparer");
            e.source.getSheetByName('Audit Planning').getRange('C7').setValue("");
          }
        }
      }
    }
    

    获取和设置活动范围是宏记录器在您的每一步之后的剩余部分,通常在您的脚本中不需要。事实上,它会减慢您的脚本速度,因此请尽量避免在大多数脚本中使用这种方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 2014-12-30
      • 2018-12-07
      • 1970-01-01
      相关资源
      最近更新 更多