首页 > 解决方案 > 将多个工作表组合到主工作表的脚本

问题描述

目前的脚本代码有错误,请看视频和代码,结果是预期的

提前致谢

标签: javascriptgoogle-apps-script

解决方案


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

此函数将读取主标题并在所有其他工作表上查找这些标题并在主文件中的正确列下返回。如果它没有找到特定的标题,它将返回工作表名称、标题名称和未找到的字符串“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);
}

工作表名称在图像上。

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述


推荐阅读