首页 > 解决方案 > getDisplayValues 未返回二维数组

问题描述

我正在编写一个脚本,该脚本根据行和列的交集更新 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)。

关于编辑代码的任何建议?

标签: arraysgoogle-apps-script

解决方案


逻辑:

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

而“日期”对象显示为[[date1, date2,..., dateX]]. 外部数组中只有 1 个元素,[date1, date2,..., dateX]并且该数组包含许多元素,例如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
 }
}

参考:


推荐阅读