0

我对 JavaScript 比较陌生,所以请多多包涵。

我在谷歌电子表格中有一张座位表,它通过命名范围在两个相邻单元格中标记了坐在那儿的人的桌号和姓名。我希望我的代码遍历所有命名范围,并获取桌号和人员的值并将其吐到两列中的新工作表中——一列中的桌号和另一列中的用户名。我遇到的一个主要问题是一些桌面编号/用户范围是垂直的(例如:desk_1 = Sheet1!F6:F7,其中 F6 是桌面编号,F7 是用户)并且一些范围是水平的(例如:desk_2 = Sheet1! G2:H2 其中 G2 是用户,H2 是桌号)所以我不知道如何从多个方向搜索。这是我的一些代码,目前无法正常工作。任何建议将不胜感激!

enter code here
function findSeats() {
var sheet = SpreadsheetApp.getActiveSheet();
var wbk = SpreadsheetApp.getActiveSpreadsheet(); 

var rng_convention = "desk_"; 
var desk_name = rng_convention; 

var users = new Array();

for ( var i = 0; i <= 1000; i++) { 
  desk_name = rng_convention; 
  desk_name = desk_name + i; 

  var rng = wbk.getRangeByName(desk_name); 

if( !rng ) { 
  continue; }
else { 
  var vals = rng.getValues(); 
  var k = 0; 

  if(vals.length == 1) {
    //look left right horizontally for user
    if(vals[0][0] == i) { 
      // create a user for this named range. 
      var user = new Object(); 

      user.name = vals[0][1]; 
      user.position = vals[0][0]; 
      users[k] = user; 
      k++;
    }
    else { 
      //look right left horizontally for user
      if (vals [0][1] == i){
      // create the user for this named range. 
      var user = new Object();

      user.name = vals[0][0]; 
      user.position = vals[0][1]; 
      users[k] = user; 
      k++;
      }
    }
  } 
/*      else {
    /* something is wrong, I need to look up-down, and then down up for users */
  }
 } 
return users; 

};
4

1 回答 1

2

你绝对是在正确的轨道上。你唯一真正的错误是你var k = 0在一个循环中设置,但试图在同一个循环中增加它。结果是您只获得了一个用户。

您希望能够确定办公桌/用户配对是水平排列还是垂直排列。为此,您正在检查由length返回的二维数组的.getValues(),它运行良好。那里没问题。

在您的问题中,您提到了办公桌/用户对的两种排列方式,但在您的代码中出现了您关注的四种,因为在您编码的水平方向中,您正在寻找办公桌号码的位置,并且假设名称在对面的单元格中。只要桌号始终与范围名称匹配,就可以了。(您可以只检查该值是否为 a number。)

所以,这是我为完成这项工作所做的更改。

  • 首先,完全摆脱k,并依靠push()构建users阵列 - 更简单,更不容易出错。
  • 我将用户对象的创建移到了测试方向的 if-then-else 块之外,同时设置了桌号。(不需要从电子表格中读取该值,因为它已经是一个循环值。)
  • 我完成了垂直方向的处理,反映了清理后的水平处理。(你知道......你可以进一步优化它,但它会失去清晰度。)
  • 添加了注释,并整理了缩进!(实际上,我是在检查代码时这样做的。)

这是生成的功能代码。

function findSeats() {
  var wbk = SpreadsheetApp.getActiveSpreadsheet(); 

  var rng_convention = "desk_"; 
  var desk_name = rng_convention; 

  var users = new Array();

  for ( var i = 0; i <= 1000; i++) { 
    desk_name = rng_convention + i; 

    var rng = wbk.getRangeByName(desk_name); 

    if ( !rng ) { 
      // No matching range name
      continue; 
    }
    else { 
      var vals = rng.getValues(); 

      // create a user for this named range. 
      var user = new Object(); 
      user.position = i; 

      var valsLength = vals.length;
      // Check orientation of the range:
      //    Horizontal...  vals.length == 1 (row)
      //    Vertical means vals.length == 2 (rows)
      if(vals.length == 1) {
        // Check whether we have desk / user, or user / desk
        if(vals[0][0] == i) { 
          // desk / user
          user.name = vals[0][1]; 
        }
        else { 
          // user / desk
          user.name = vals[0][0]; 
        }
      }
      else {
        // vals.length == 2
        // Check whether we have desk / user, or user / desk
        if(vals[0][0] == i) { 
          // desk / user
          user.name = vals[1][0]; 
        }
        else { 
          // user / desk
          user.name = vals[0][0]; 
        }
      }

      // Add this user to our array
      users.push(user);
    }
  }
  // Return array of user objects
  return users; 
};

样本数据

样本数据

调试输出

调试输出

编辑:在电子表格中记录所有收集的数据

要回答后续问题,可以直接将所有收集到的办公桌和用户信息放入电子表格中。为了准备.setValues()函数,我们需要将我们的对象转换为二维数组,这很容易。或者,可以重构先前的代码以首先生成一个数组。

这是我们如何执行转换并将所有数据写入工作表的方法。如果命名的工作表不存在,我们将首先创建它 - 否则,我们将替换以前的内容。

// Record all desk / user data to a (new) sheet
function recordAllDeskUsers() {
  var users = findSeats();
  var userArray = new Array();
  userArray.push(["Desk #","User Name"]);

  for (var i in users) {
    var thisUser = [users[i].position,users[i].name];
    userArray.push(thisUser);
  }

  // Open the target sheet - if it doesn't exist, insert it.
  var userSheetName = "All Desks";
  var userSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(userSheetName);
  if (!userSheet) {
    SpreadsheetApp.getActiveSpreadsheet().insertSheet(userSheetName)
    userSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(userSheetName);
  }

  // Clear the sheet, then write our collected values to it.
  userSheet.clear();
  userSheet.getRange(1, 1, userArray.length, userArray[0].length).setValues(userArray);
}
于 2013-03-20T02:20:53.763 回答