为什么getLastRow方法无法正常工作

时间:2018-10-10 21:42:02

标签: javascript google-apps-script google-sheets

使用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();
 }

1 个答案:

答案 0 :(得分:1)

可能的问题:

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

解决方案

  • 先获取工作表,然后执行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);
}

参考文献: