【问题标题】:About Google Sheets that is shared with users关于与用户共享的 Google 表格
【发布时间】:2019-05-22 05:32:22
【问题描述】:

我有一个与他人共享的 Google 表格。我的工作表名称是“OrderList”。我正在寻找一个脚本,该脚本可以在用户编辑工作表时获取用户的电子邮件地址并输入到另一个单元格中。我编写了以下代码,但它只返回工作表所有者的 Gmail 地址:

var COLUMNTOCHECK1 = 5;
var COLUMNTOCHECK2 = 6;

var DATETIMELOCATION1 = [0,2];
var DATETIMELOCATION2 = [0,3];

var SHEETNAME = 'OrderList'

function onEdit(e) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();

if( sheet.getSheetName() == SHEETNAME ) { 
var selectedCell = ss.getActiveCell();

if( selectedCell.getColumn() == COLUMNTOCHECK1) { 
    var email = Session.getActiveUser().getEmail();

  var dateTimeCell = 
  selectedCell.offset(DATETIMELOCATION1[0],DATETIMELOCATION1[1]);
  dateTimeCell.setValue(new Date());
  var dateTimeCell1 = 
  selectedCell.offset(DATETIMELOCATION2[0],DATETIMELOCATION2[1]);
  dateTimeCell1.setValue(email);
  }
   if( selectedCell.getColumn() == COLUMNTOCHECK2) { 
  var dateTimeCell = 
  selectedCell.offset(DATETIMELOCATION2[0],DATETIMELOCATION2[1]);
  dateTimeCell.setValue(new Date());
   }

   }
   }

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    由于您正在运行此onEdit(e),因此您可以使用Event Objects,它们非常适合捕获您想要获取的数据。不过,您需要为您的项目设置一个 onEdit 触发器来捕获电子邮件地址。下面的代码应该可以达到您的预期。

    var COLUMNTOCHECK1 = 5;
    var COLUMNTOCHECK2 = 6;
    
    var DATETIMELOCATION1 = [0,2];
    var DATETIMELOCATION2 = [0,3];
    
    var SHEETNAME = 'OrderList'
    
    function onEdit(e) {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getActiveSheet();
    
      if( sheet.getSheetName() == SHEETNAME ) { 
        var selectedCell = ss.getActiveCell();
    
        if( selectedCell.getColumn() == COLUMNTOCHECK1) { 
          var email = e.user.getEmail();
    
          var dateTimeCell = 
              selectedCell.offset(DATETIMELOCATION1[0],DATETIMELOCATION1[1]);
          dateTimeCell.setValue(new Date());
          var dateTimeCell1 = 
              selectedCell.offset(DATETIMELOCATION2[0],DATETIMELOCATION2[1]);
          dateTimeCell1.setValue(email);
        }
        if( selectedCell.getColumn() == COLUMNTOCHECK2) { 
          var dateTimeCell = selectedCell.offset(DATETIMELOCATION2[0],DATETIMELOCATION2[1]);
          dateTimeCell.setValue(new Date());
        }
    
      }
    }
    

    如您所见,我已将您的 var email 更改为使用事件对象来捕获正在编辑电子表格的用户的电子邮件地址:

    var email = e.user.getEmail();
    

    【讨论】:

    • 我把代码改成了这个,但它只显示所有者,不显示其他编辑的电子邮件。
    • 通读documentation for getEmail(),它的工作原理背后有一套相当复杂的安全策略,很可能这些会阻止您获取用户的电子邮件。
    • 从我链接到你的文档中,你很可能必须让每个用户手动授权脚本。
    • 当我将代码编辑为“var email = e.user.getEmail();”时运行,这条消息显示给我:TypeError: Cannot read property "user" from undefined.
    • 如果您使用事件对象,您将无法手动运行它,因为事件对象仅在脚本从触发器运行时传递。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多