将多个工作表合并到一个主表的脚本

时间:2019-04-18 15:51:01

标签: javascript google-apps-script

当前的脚本代码有错误,请参见视频和代码,并期待结果

预先感谢

1 个答案:

答案 0 :(得分:2)

使用标题字符串作为键来组合其他工作表中存在于母版上的特定列

此函数将读取母版标头,并在所有其他工作表上查找那些标头,然后在母版中正确的列下返回。如果找不到特定的标题,它将返回工作表名称,标题名称以及未找到的字符串“ nf”。

它还具有排除您不希望参与该流程的工作表的功能,并且当然可以像您的代码一样,它使用名为“ Master”的工作表作为目的地,因此不会读取主表中的数据,但会读取主表以获取第一行中的列名以在其他表中进行搜索。

我查看了您的代码,弄清楚您在做什么之后,我发现自己完成此操作要容易得多。

代码:

function combineDataForAllSheets() {
  var ss=SpreadsheetApp.getActive();
  var excl=['Globals','Form Responses 1','Form Responses 2'];
  var masterSheet="Master";
  for(var i=0;i<excl.length;i++) {ss.getSheetByName(excl[i]).hideSheet()}
  var sh=ss.getSheetByName(masterSheet);
  var hrg=sh.getRange(1,1,1,sh.getLastColumn());
  var mhA=hrg.getValues()[0];
  sh.getRange(2,1,sh.getMaxRows()-1,sh.getLastColumn()).clearContent();
  var shts=ss.getSheets();
  for(var i=0;i<shts.length;i++) {
    if(!shts[i].isSheetHidden() && shts[i].getName()!=masterSheet) {
      var shx=shts[i];
      var name=shx.getName();
      var hAx=shx.getRange(1,1,1,shx.getLastColumn()).getValues()[0];
      var nr=sh.getLastRow()+1;
      for(var ix=0;ix<mhA.length;ix++) {
        vAix=[];
        var header=mhA[ix];
        var index=hAx.indexOf(mhA[ix]);
        if(hAx.indexOf(mhA[ix])>-1) {
          var vAix=shx.getRange(2,hAx.indexOf(mhA[ix])+1,shx.getLastRow()-1,1).getValues(); 
        }else{
          for(var kx=0;kx<shx.getLastRow()-1;kx++) {
            vAix.push([shx.getName()+ '-'+ mhA[ix] +'-nf']);
          }
        }
        sh.getRange(nr,ix+1,shx.getLastRow()-1,1).setValues(vAix);
      }                     
    }
  }
}

一些测试代码,可用于在不同的列位置生成相同名称的标题。我评论了可以更改以影响其生成测试数据的方式。

function createTestData() { 
  var m=0;//0 for random column positions >0 for fixed position
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getActiveSheet();
  sh.clearContents();
  var cols=10;//number of columns
  var rows=20;//number of rows
  var hpref='hdr';
  var hA=[];
  var hdrA=[];
  var cA=[];
  for(var i=0;i<cols;i++) {hA.push(i+1);};
  for(var i=0;i<cols;i++) {
    if(m==0) {
      var index=Math.floor(Math.random() * hA.length);
    }else{
      var index=i;
    }  
    var hnum=hA[index];
    hdrA.push(hpref + hnum);
    cA.push(hnum);
    if(m==0) {
      hA.splice(index,1);
    }
  }
  sh.getRange(1,1,1,hdrA.length).setValues([hdrA]);    
  var rg=sh.getRange(2,1,rows,cols);  
  var vA=rg.getValues();
  for(var i=0;i<rows;i++) {
    for(var j=0;j<cols;j++) {
      vA[i][j]=Number(i+1) + ',' + cA[j];
    }
  }
  rg.setValues(vA);
}

页面名称在图像上。

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here