首页 > 解决方案 > 为什么 getLastRow 方法无法正常工作

问题描述

使用 Google 表格,在将数据传输到“数据库”页面之前将数据输入到单元格中。

问题:
1) 传输完成后,以前的条目被新条目替换。
2) 数据库将从不同的行(即第 35 行)而不是第 1 行开始。

问题:是什么导致了这两个问题,以及如何解决这些问题?

下面是我的脚本。提前致谢!

function setValue(cellName, value) {
  SpreadsheetApp.getActiveSpreadsheet().getRange(cellName).setValue(value);
}

function getValue(cellName) {
  return SpreadsheetApp.getActiveSpreadsheet().getRange(cellName).getValue();
}

function getNextRow() {
  return SpreadsheetApp.getActiveSpreadsheet().getLastRow() + 1;
}

function addTrade(a,b,c,d,e,f,g) {
  var row = getNextRow();
  setValue('Meta4!B' + row, a);
  setValue('Meta4!C' + row, b);
  setValue('Meta4!D' + row, c);
  setValue('Meta4!E' + row, d);
  setValue('Meta4!F' + row, e);
  setValue('Meta4!G' + row, f);
  setValue('Meta4!H' + row, g);
}

function submitTrade() {
 addTrade(new Date(), getValue('Dashboard!N3'), getValue('Dashboard!N4'),  getValue('Dashboard!N5'), getValue('Dashboard!N6'), getValue ('Dashboard!N7'), getValue('Dashboard!N8'));

 var app = SpreadsheetApp;
 var activeSheet = app.getActiveSpreadsheet().getActiveSheet();
 activeSheet.getRange('Dashboard!N3:O8').clearContent();
 }

标签: javascriptgoogle-apps-scriptgoogle-sheets

解决方案


可能的问题:

  • getLastRow在错误的工作表上执行
  • 可能的数据验证下拉列表/无法识别的值,直到第 35 行
  • 代码重复

解决方案

  • 先获取sheet再执行getLastRow
  • 从工作表中删除数据验证
  • 使用 DRY 原则

流动:

  • 将源工作表值作为数组获取,将当前日期添加到其中并转置数组。
  • 从目标工作表中获取 lastRow 并 setValues 修改后的数组。

示例脚本:

function transposeWithDate() {

  var cfg = {
    ssh: 'Dashboard',//sourceSheet
    sRng: 'N3:N8',//sourceRange
    tsh: 'Meta4',//targetSheet
    dt: new Date(),
  };

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var source = ss.getSheetByName(cfg.ssh);
  var values = source.getRange(cfg.sRng).getValues(); //[[1],[2],[3]]
  var target = ss.getSheetByName(cfg.tsh);
  var lastRow = target.getLastRow();
  values.unshift([cfg.dt]); //add Date
  var transposedVal = [ //transpose values [[date,1,2,3]]
    values.map(function(e) {
      return e[0];
    }),
  ];
  target
    .getRange(lastRow + 1, 2, transposedVal.length, transposedVal[0].length)
    .setValues(transposedVal);
}

参考:


推荐阅读