【问题标题】:getDisplayValues is not returning a 2-D arraygetDisplayValues 未返回二维数组
【发布时间】:2020-12-25 12:00:45
【问题描述】:

我正在编写一个脚本,该脚本根据行和列的交集来更新 Google 表格中的单元格。我通过遍历唯一教师姓名列表来找到该行。当我找到名称时,我在变量“row”中捕获它的行号。然后,我遍历一系列作为日期的列标题以查找特定日期,并将其列号捕获为变量“列”。但是,当我查看代码中每个对象的结构时,“名称”对象显示为 [[Person1]、[Person2]、...、[PersonX]],而“日期”对象显示为 [[date1 , 日期 2,..., 日期 X]]。我可以很好地遍历名称对象,但日期对象不是那么多,我怀疑这是由于结构造成的。

我知道 getDisplayValues 返回一个字符串,当我需要从单元格中获取日期并将其命名为“dateValue”时,它可以在我的代码的另一个区域正常工作。但是,当我在下面代码的“日期”对象中查找该 dateValue 时,这就是我的代码失败的地方。

下面是代码示例:

function updateTracker(){ 
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var teacherName = sheet.getRange('F7').getDisplayValue();
  var dateValue = sheet.getRange('N7').getDisplayValue();
   
  var tracker = SpreadsheetApp.openById('AAAbbbCCCxxxYYYzzz111222333');
  var tab = tracker.getSheetByName('Tracker');
  var names = tab.getRange(1, 4, tab.getLastRow(), 1).getDisplayValues();
  var dates = tab.getRange(1, 1, 1, tab.getLastColumn()).getDisplayValues();
  
  for (var i in names) {
    if (names[i][0] === teacherName) {
      var row = parseInt(i+1);
      }
  }

  for (var j in dates){
    if (dates[0][j] === dateValue) {
      var column = parseInt(j+1);
    }
  }
  
  var cell = tab.getRange(row, column).setValue('x');
}

我在 getRange 期望 (number, number) 但它得到 (number, null) 的最后一行出现错误。

对编辑代码有什么建议吗?

【问题讨论】:

    标签: arrays google-apps-script


    【解决方案1】:

    逻辑:

    [[Person1], [Person2],..., [PersonX]] 的情况下,您迭代“外部”数组。外部数组中有X 元素。每个元素本身都是一个数组("inner") like [Person1],每个元素只有 1 个原始元素 Person1

    而“日期”对象显示为 [[date1, date2,..., dateX]]。外部数组[date1, date2,..., dateX] 中只有 1 个元素,而该数组包含许多元素,例如 date1

    解决办法:

    您应该在日期数组中迭代内部数组:

    for (var j in dates[0]){//note `[0]`
    

    使用for...in 来迭代数组也被认为是不好的做法。请改用for...of

    let column = null, j = 0;
    for (const date of dates[0]){
     j++;
     if (date === dateValue) {
       column = parseInt(j+1);//also bad to declare var in a block. Moved declaration outside
     }
    }
    

    参考资料:

    【讨论】:

    • 谢谢!这正是我所需要的。另外,感谢您提供最佳实践建议。作为自学成才,我寻找任何和所有建议来改进我的代码。我以前从未听说过for ... of,但会经历我的其他一些项目并进行修改。非常感谢!
    • @AdamCaudell 虽然在这种情况下,由于您使用计数器 j 和计数器 for-loop: for(let j=0;j<arr.length;++j) 会是一个更好的主意。如果不使用j,那么for..of会更好
    猜你喜欢
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2016-05-02
    • 2014-12-22
    • 2013-03-08
    • 2019-03-06
    • 2015-09-23
    相关资源
    最近更新 更多