【问题标题】:Concatenating columns from many sheets in a single sheet将多个工作表中的列连接到一个工作表中
【发布时间】:2019-07-15 08:35:38
【问题描述】:

我想将许多工作表中的数据检索到一张工作表中。 我的工作表中有 13 列标题,所以我只从所有工作表的第二行获取数据。

例如,我有 3 张工作表,名称分别为“FR”、“UK”、“DE”和“Master”。 我的列是国家、名称、月份使用情况、型号、机器。 从第 2 行开始,我有大量关于“FR”、“UK”、“DE”的数据。 “Master”只有列名。

我想将所有数据合并到一个名为“Master”的工作表中。

所以我从 Youtube 中获取了一个代码“将一张纸合二为一”,制作视频的人制作了代码来检索 3 列的数据。 它实际上确实从我的 3 列中检索数据。

function combineData() {

var masterSheet = "Master";

var ss = 
SpreadsheetApp.getActiveSpreadsheet().getSheetByName(masterSheet);
var lc = ss.getLastColumn();
var lr = ss.getLastRow();

// ss.getRange(2,1,lr-1,lc).clearContent();
var labels = ss.getRange(1, 1, 1, lc).getValues()[0];



labels.forEach(function(label, i) {
    var colValues = getCombinedColumnValues(label, masterSheet);
    ss.getRange(2, i + 1, colValues.length, 1).setValues(colValues);
})


function getCombinedColumnValues(label, masterSheetName) {

    var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();

    var colValues = [];

    for ([i, sheet] in sheets) {
        var sheetName = sheet.getSheetName();
        if (sheetName !== masterSheetName && sheetName !== "UID") {
            var tempValues = getColumnValues(label, sheetName);
            colValues = colValues.concat(tempValues);
        }
    }

    return colValues;
}

function getColumnValues(label, sheetName) {

    var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);
    var colIndex = getColumnIndex(label, sheetName);
    var numRows = ss.getLastRow() - 1;
    var colValues = ss.getRange(2, colIndex, numRows, 1).getValues(); // for name, index =2 but replacing by colIndex says "startong column too small)
    return colValues;
}


function getColumnIndex(label, sheetName) {
    var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName);

    var lc = ss.getLastColumn();
    var lookupRangeValues = ss.getRange(1, 1, 1, lc).getValues()[0];

    var index = lookupRangeValues.indexOf(label) + 1;

    return index;
}

};

我认为代码对于我的主表中存在的列数是动态的,但事实并非如此。编译时的错误是“范围的起始列太小” 有没有人有解决这个错误的想法?

谢谢。

【问题讨论】:

  • 你在哪一行有这个错误?
  • 开启:labels.forEach(function(label, i) { var colValues = getCombinedColumnValues(label, masterSheet); ss.getRange(2, i + 1, colValues.length, 1).setValues( colValues); }) 我运行了调试器,我看到 i = 3
  • 但是错误提示“范围的起始列太小”。就在这里: var colValues = ss.getRange(2, colIndex, numRows, 1).getValues(); // 对于名称,索引 =2 但替换为 colIndex 表示“startong 列太小)
  • 使用Logger.log(colIndex) 找出它返回的内容。
  • Logger.log(colIndex) 给出从 1 到 4 的值。

标签: google-apps-script google-sheets


【解决方案1】:

从所有表格中获取数据

function getDataFromAllSheets() {
  var excl=['Master'];//Sheets to exclude
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Master');//data destination
  sh.getRange(2,1,sh.getLastRow(),sh.getLastColumn()).clearContent();//clears old data but leaves headers
  var shts=ss.getSheets();
  for(var i=0;i<shts.length;i++) {
    if(excl.indexOf(shts[i].getName())>-1) {//does not collected data from excluded sheets
      var vA=shts[i].getDataRange().getValues();//get sht[i] data
      for(var j=1;j<vA.length;j++) {//skips first line
        sh.appendRow(vA[j]);//appends all rows after first line
      }
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    相关资源
    最近更新 更多