循环数组以匹配组成员资格

时间:2013-12-01 09:00:19

标签: google-apps-script

我正在尝试设置一个脚本,在脚本提交时获取用户的上下文,获取用户ID(电子邮件),搜索电子表格以找到用户,然后找到经理&# 39;用户所关联的电子邮件。下面是我正在开发的一些代码,我可以从电子表格中获取数据并创建一个数组并在其上循环。我想知道是否有人可以提供有关构建电子表格以搜索和查找成员资格的最佳方法的建议,以及如何在脚本中执行此操作。

function getUser() {
 //Uses the base class to get acive user's email
   var email = Session.getActiveUser().getEmail();
 //Uses the UserManager class to get info by passing in the getActive user from base class
   var userFirst = UserManager.getUser(Session.getActiveUser()).getGivenName();
   var userLast = UserManager.getUser(Session.getActiveUser()).getFamilyName();
 //Go to View then Log to see results
 return email;
 }

//Function used to look up manager of user submitting PTO request
function getManager() {
  var requestor = getUser();
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var manager = ss.getSheetByName('Managers');
  var values = manager.getDataRange().getValues();

  for ( i = 0; i < values.length; i++) {
    var obj = values[i];
    Logger.log(obj);
    for (var j in obj) {
    var value = obj[j];
     //Logger.log(value);
      if (value == requestor){
       Logger.log(value);
      }
    }

我开始考虑在一张纸上有一个用户列表,而在另一张纸上有经理但是没有出售,因为我不确定如何将用户与经理联系起来。然后想到可能有三列,每列都以经理开头,每一行都在经理的名下用户名?

我喜欢脚本以避免硬编码值。任何激发想法的想法或建议都是如此受欢迎。

感谢

已更新 好的,所以我已经处理了代码,现在运行了三个函数。我还决定使用两张电子表格,一张用于经理,一张用于员工。每张纸都相似。三列(名称,电子邮件,组ID)员工的组ID将与该员工所属的经理的groupID匹配。这是更新的代码:getUser()将获得活动用户,findEmployee()使用getUser获取电子邮件然后匹配它并返回groupID。 getMnger()使用groupID查找经理电子邮件。

我不确定这是最好的方式,但我也在自学。 (只能在这里和那里玩耍

function getUser() {
 //Uses the base class to get acive user's email
   var email = Session.getActiveUser().getEmail();
 //Uses the UserManager class to get info by passing in the getActive user from base class
   var userFirst = UserManager.getUser(Session.getActiveUser()).getGivenName();
   var userLast = UserManager.getUser(Session.getActiveUser()).getFamilyName();
 //Go to View then Log to see results
   return email;
 }

function findEmployee() {
  //Gets the active Spreadsheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  //Gets the sheet by name
  var employee = ss.getSheetByName('Roster');
  //get the values in sheet
  var values = employee.getDataRange().getValues();
  // makes a call to function getUser() to return email of active user
  var user = getUser();
  // loops over data values, matches to active user email, returns group ID
  for (var i=0; i < values.length; i++) {
    for (var j=0; j < values[i].length; j++) {     
      if ( values[i][j] == user) {
       return values[i][2];
       //used to verify / debug
       Logger.log(values[i][2]);
    }
   }
  }
 }

function getMnger(){
  //Gets current spreadsheet and locates the managers sheet and grabs the data
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var manager = ss.getSheetByName('Managers');
  var values = manager.getDataRange().getValues();
  var groupID = findEmployee();

  //Loops over the data creating associative array
  for (var i=0; i < values.length; i++) {
    for (var j=0; j < values[i].length; j++) {
      if ( values[i][j] == groupID) {
        //Used to debug and verify
          Logger.log(values[i][1]);
        return values[i][1];
    }      
   }     
  } 
 }

这是一项正在进行的工作。到目前为止,有人有想法吗?我现在最大的问题是如何根据另一个值返回我想要的值。在findEmployee()和getMnger()中,一旦匹配,就会返回values [] []中的硬编码索引。即返回值[i] [1];或返回值[i] [2];

有没有办法确保这里不需要硬编码值?基本上我希望带走用户并在工作表的列中找到他,然后在他的电子邮件旁边的另一列中返回相应的groupID。有意义吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以在电子表格中使用filter。由于您希望避免硬编码值,您可以创建两个表,一个用于管理员,一个用于用户,为每个管理员分配一个唯一键,然后为用户列表表中的每个用户包括唯一的管理员密钥对应他们的经理。