【问题标题】:How to Get (& Set) cell values from one sheet to another in Google Sheets?如何在 Google 表格中从一张表格获取(和设置)单元格值到另一张表格?
【发布时间】:2018-03-05 17:56:36
【问题描述】:

希望从用作订单输入表单的 Google 表格文件的第一张表格 (POTemplate) 中的多个单元格中获取值。第 22 行是表单中的第一行,它从我们的用户那里收集有关订购商品的数据。
我想设置这些值的选项卡 (POHistory) 将用作每个订单键入 POTemplate 选项卡的所有订单详细信息的运行日志。 PO 模板日志中记录的每个条目都应包括每个订单的唯一 PO 编号(可在 POTemplate 选项卡的单元格 N3 中找到)和 PO 日期(POTemplate 选项卡的单元格 N4)。我真诚地感谢您的帮助。

function submit() {
  var app = SpreadsheetApp;
  var tplSheet = app.getActiveSpreadsheet().getSheetByName("POTemplate");
  var tplFRow = 22, tplLRow = tplSheet.getLastRow();
  var tplRowsNum = tplLRow - tplFRow + 1;
  var tplFCol = 1, tplLCol = 16;
  var tplColsNum = tplLCol - tplFCol + 1;
  var rangeData = tplSheet.getRange(22, 1, tplRowsNum, tplColsNum).getValues();
  var colIndexes = [0, 3, 10, 12, 15];
  var fData = filterByIndexes(rangeData, colIndexes);
  var target = "POHistory";
  var targetSheet = app.getActiveSpreadsheet().getSheetByName(target);
  var tgtRow = targetSheet.getLastRow() + 1;
  var tgtRowsNum = fData.length - tgtRow + 1;
  var tgtCol = 1;
  var tgtColsNum = fData[0].length - 1 + 1;
   targetSheet.getRange(tgtRow, tgtCol, tgtRowsNum, 
tgtColsNum).setValues(fData);
}

function filterByIndexes(twoDArr, indexArr) {
  var fData = [];
  twoDArr = twoDArr.transpose();
  for(var i=0; i<indexArr.length; i++) {
     fData.push(twoDArr[indexArr[i]]);
   }
  return fData.transpose();
}

Array.prototype.transpose = function() {
  var a = this,
      w = a.length ? a.length : 0,
      h = a[0] instanceof Array ? a[0].length : 0;
   if (h === 0 || w === 0) {return [];}
   var i, j, t = [];
  for (i = 0; i < h; i++) {
     t[i] = [];
     for (j = 0; j < w; j++) {
      t[i][j] = a[j][i];
     }
   }
  return t;
}

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    我可以为您提供对您提供的 submit() 函数的修改。

        function process(){
      submit();
      submitDate();
    }
    
    function submitDate() {
      var app = SpreadsheetApp;
      var tplSheet = app.getActiveSpreadsheet().getSheetByName("POTemplate");
      var tplFRow = 1, tplLRow = 21;
      var tplRowsNum = tplLRow - tplFRow + 1;
      var tplFCol = 1, tplLCol = 16;
      var tplColsNum = tplLCol - tplFCol + 1;
      var rangeData = tplSheet.getRange(tplFRow, tplFCol, tplLRow, tplColsNum).getValues();
      var colIndexes = [13];
      var fData = filterByIndexes(rangeData, colIndexes);
      var target = "POHistory";
      var targetSheet = app.getActiveSpreadsheet().getSheetByName(target);
      var tgtRow = targetSheet.getLastRow() + 1;
      var tgtRowsNum = fData.length - tgtRow + 1;
      var tgtCol = 1;
      var tgtColsNum = fData[0].length - 1 + 1;
      Logger.log(fData)
      fData=fData.transpose();
      Logger.log(fData)
      targetSheet.getRange(tgtRow-1, 5, fData.length, 
                           fData[0].length).setValues(fData);
    }
    
    function submit() {
      var app = SpreadsheetApp;
      var tplSheet = app.getActiveSpreadsheet().getSheetByName("POTemplate");
      var tplFRow = 22, tplLRow = tplSheet.getLastRow();
      var tplRowsNum = tplLRow - tplFRow + 1;
      var tplFCol = 1, tplLCol = 16;
      var tplColsNum = tplLCol - tplFCol + 1;
      var rangeData = tplSheet.getRange(22, 1, tplRowsNum, tplColsNum).getValues();
      var colIndexes = [0, 3, 10, 12, 15];
      var fData = filterByIndexes(rangeData, colIndexes);
      var target = "POHistory";
      var targetSheet = app.getActiveSpreadsheet().getSheetByName(target);
      var tgtRow = targetSheet.getLastRow() + 1;
      var tgtRowsNum = fData.length - tgtRow + 1;
      var tgtCol = 1;
      var tgtColsNum = fData[0].length - 1 + 1;
      targetSheet.getRange(tgtRow, tgtCol, tgtRowsNum, 
                           tgtColsNum).setValues(fData);
    }
    
    function filterByIndexes(twoDArr, indexArr) {
      var fData = [];
      twoDArr = twoDArr.transpose();
      for(var i=0; i<indexArr.length; i++) {
        fData.push(twoDArr[indexArr[i]]);
      }
      return fData.transpose();
    }
    
    Array.prototype.transpose = function() {
      var a = this,
          w = a.length ? a.length : 0,
          h = a[0] instanceof Array ? a[0].length : 0;
      if (h === 0 || w === 0) {return [];}
      var i, j, t = [];
      for (i = 0; i < h; i++) {
        t[i] = [];
        for (j = 0; j < w; j++) {
          t[i][j] = a[j][i];
        }
      }
      return t;
    }
    

    基本上,类似的代码会运行两次。我这样做可能会受到批评,但也许这样对你很方便。

    【讨论】:

    • 谢谢你,大卫!但是,我收到的错误消息指出,Submit() 函数中的最后一行代码指出我们引用了不正确的范围高度 22。错误消息指出高度应该是 18?不知道如何进行。感谢您的帮助!
    • 这是我用来测试代码的电子表格。 (Tools>script ... run>process())docs.google.com/spreadsheets/d/…我已经添加了一行代码来清除工作表,第41行
    • 在电子表格中的脚本中,我添加了 Logging.gs 文件,我复制了 submit() 函数,但稍微简化了(为了我的利益),现在它是 submit2() 函数。因此,运行 submit2() 会累积到 POHistory 表中,而不是清除它(至少它对我有用!)
    猜你喜欢
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    相关资源
    最近更新 更多