将光标放在包含今天打开工作表日期的单元格中

时间:2014-01-06 16:27:58

标签: google-apps-script google-sheets

使用今天的函数我今天的日期在单元格C4中。要查询的数据范围是G4:af250。

我的脚本是:

onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var dates = sheet.getRange(G4:AF250).getValues();

  var today = C4();
    }
Goto 'today'()  }
}`

我在收到错误后收到错误,而不是去今天日期范围内的单元格。

帮助。

1 个答案:

答案 0 :(得分:0)

您开始掌握JavaScript的语法,所以请继续。也许尝试在CodeAcademy的学习路径上努力,帮助锤击它。

function onOpen() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var dateRange = sheet.getRange('G4:AF250');
  var dates = dateRange.getValues();
  var today = sheet.getRange('C4').getValue();

  // Find today in the dateRange
  var found = false;
  var row=dates.length-1;
  while (row >= 0 && !found) {
    var col=dates[row].length-1;
    while (col>=0 && !found) {
      // If the array cell matches 'today', stop looking.
      if (!(today > dates[row][col]) && !(today < dates[row][col])) {
        found = true;
        break;
      }
      col--;
    }
    if (!found)
      row--;
  }

  // Use search row & col to offset to a cell relative to dateRange start
  var active = dateRange.offset(row, col,1,1);

  // Move user's cursor to today's date, if it is found in dateRange
  if (found)
    sheet.setActiveRange(active);
}

编辑:一些关键点的说明。

此功能会在G4:AF250范围内搜索与C4内容的匹配项。预计该单元格的内容为=TODAY()。如果该假设是正确的,那么结果应该是用户的光标将被放置在匹配的单元格中,如果它存在。如果未找到匹配项,则光标将保留在它开始的位置(A1)。

在Javascript中,

日期匹配很棘手。您不能只测试相等性,因此此代码测试today是否在目标单元格中​​的日期之前或之后;如果它不是之前或之后,那么它必须是相同的。 (还有其他方法,请参阅Compare two dates with JavaScript。)

此处不包含任何测试,以确保从电子表格中读取的值实际上是Date对象。如果您在C4或dateRange中有字符串或数字,则不会进行匹配。例如,日期1/4/2014不等于字符串"1/4/2014"

要测试匹配项,我们的代码必须遍历dateRange的两个维度。我们可以使用for循环从0开始执行此操作。但是,在这种情况下,我们从最大值开始并重新开始工作。这个选择对于active单元格的定义很方便,稍后。

与往常一样,在处理Spreadsheets时,您需要注意Spreadsheet行和列引用从1开始,而Javascript数组从0开始。这意味着一旦我们使用getValues()读取一系列值,我们有一个0..(maxRows-1)的{​​{1}}二维数组。如果删除0..(maxCols-1),则最终会尝试引用不存在的值,并生成错误。