Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 循环数组以匹配组成员资格_Google Apps Script - Fatal编程技术网

Google apps script 循环数组以匹配组成员资格

Google apps script 循环数组以匹配组成员资格,google-apps-script,Google Apps Script,我正在尝试设置一个脚本,该脚本在表单提交时获取用户的上下文,获取用户ID(电子邮件),搜索电子表格以定位用户,然后查找与该用户关联的经理电子邮件。下面是我一直在开发的一些代码,我能够从电子表格中获取数据,并创建一个数组和循环。我想知道的是,是否有人可以帮助提供建议,以最好的方式来组织电子表格,以搜索和定位会员资格,然后如何在脚本中做到这一点 function getUser() { //Uses the base class to get acive user's email var e

我正在尝试设置一个脚本,该脚本在表单提交时获取用户的上下文,获取用户ID(电子邮件),搜索电子表格以定位用户,然后查找与该用户关联的经理电子邮件。下面是我一直在开发的一些代码,我能够从电子表格中获取数据,并创建一个数组和循环。我想知道的是,是否有人可以帮助提供建议,以最好的方式来组织电子表格,以搜索和定位会员资格,然后如何在脚本中做到这一点

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);
      }
    }
函数getUser(){ //使用基类获取acive用户的电子邮件 var email=Session.getActiveUser().getEmail(); //使用UserManager类通过从基类传入getActive user来获取信息 var userFirst=UserManager.getUser(Session.getActiveUser()).getGivenName(); var userLast=UserManager.getUser(Session.getActiveUser()).getFamilyName(); //转到查看,然后登录以查看结果 回复邮件; } //用于查找提交PTO请求的用户的管理员的函数 函数getManager(){ var requestor=getUser(); var ss=SpreadsheetApp.getActiveSpreadsheet(); var manager=ss.getSheetByName('Managers'); var values=manager.getDataRange().getValues(); 对于(i=0;i 我开始想在一张纸上有一个用户列表,在另一张纸上有一个经理列表,但我不知道如何将用户与经理联系起来,所以我没有这样做。然后我想可能有三列,每列都以经理开头,每行都在经理的用户名下面

我希望脚本避免硬编码值。任何激发想法的想法或建议都是非常受欢迎的

谢谢

已更新 好的,我已经编写了代码,现在有三个功能正在运行。我还决定使用一个电子表格,其中有两张表格,一张给经理,一张给员工。每张表格都很相似。三列(姓名、电子邮件、groupID)员工的组ID将与该员工所属经理的组ID匹配。以下是更新的代码:getUser()将获取活动用户,findEmployee()使用getUser获取电子邮件,然后将其匹配并返回组ID。getMnger()使用组ID查找经理电子邮件

我不确定这是不是最好的方法,但我也在学习自学。(只能到处玩。)

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];
    }      
   }     
  } 
 }
函数getUser(){ //使用基类获取acive用户的电子邮件 var email=Session.getActiveUser().getEmail(); //使用UserManager类通过从基类传入getActive user来获取信息 var userFirst=UserManager.getUser(Session.getActiveUser()).getGivenName(); var userLast=UserManager.getUser(Session.getActiveUser()).getFamilyName(); //转到查看,然后登录以查看结果 回复邮件; } 函数findeEmployee(){ //获取活动的电子表格 var ss=SpreadsheetApp.getActiveSpreadsheet(); //按名称获取工作表 var employee=ss.getSheetByName(“花名册”); //获取工作表中的值 var values=employee.getDataRange().getValues(); //调用函数getUser()以返回活动用户的电子邮件 var user=getUser(); //循环数据值,匹配活动用户电子邮件,返回组ID 对于(变量i=0;i 这是一项正在进行的工作。到目前为止有人有想法吗?我现在最大的问题是如何基于另一个值返回我想要的值。在findEmployee()和getMnger()中,一旦匹配,它将返回一个硬编码的索引,其值为[][]。即返回值[I][1];或返回值[I][2]

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


谢谢!

您可以在电子表格中使用
过滤器
。由于您希望避免硬编码值,您可以创建两个工作表,一个为经理,一个为用户,为每个经理分配一个唯一的密钥,然后为用户列表中的每个用户,包括对应于其经理的唯一经理密钥。

您是否在第二种情况下,scriptdB可能是一种更好的方法,每个用户都可以轻松搜索“链接管理器”属性。想法是,用户将点击谷歌表单请求带薪休假(PTO)。他们将选择两个字段,一个开始日期和结束日期,然后提交。从这里开始,其余工作由脚本完成。脚本将找出提交者(同一域中的所有用户)。一旦脚本知道用户(getUser函数)它将查找该用户的经理。这将允许脚本启动电子邮件通知以获得PTO的批准。好的。我想我已经找到了我想要在这里循环和识别的内容,我想它显示在