Объединение определенных столбцов, которые существуют на Master, с других листов с использованием строк заголовков в качестве ключей
Эта функция будет читать заголовки мастера, искать эти заголовки на всех других листах и возвращаться под правильными столбцами в мастере. Если он не находит определенный заголовок, он возвращает имя листа, имя заголовка и строку «nf» для not found.
Он также имеет возможность исключать листы, которые вы не хотите вовлекать в процесс, и, конечно, как ваш код сделал , он использует лист с именем «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);
}
Названия листов на изображениях.