Суммирование идентичных дат в нескольких строках в отдельные столбцы в одной и той же строке
Я не совсем понимаю, как вы переходили от примера 1 к примеру 2, но ясно, что вы хотите суммировать несколько строк с помощьюодна и та же дата в нескольких столбцах в одной строке, и вот для чего эта функция является примером.
Я предполагаю, что, как только вы дадите лучшее объяснение того, что вы пытаетесь выполнить, и как это должно работать, вы можетеполучите ответы, которые намного проще понять.
В любом случае, я предлагаю это решение как возможность, с которой вы можете начать, если хотите.Я использую объект ключ / значение для отслеживания количества идентичных дат, и если метод dObj.hasOwnProperty () возвращает false, то это также помогает определить новые даты.
Код:
function condenseDates(){
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('sheet name');//you need to change this for the appropriate sheet name
var rg=sh.getDataRange();//get all data values including headers
var vA=rg.getValues();
var dObj={};//data object which is used to identify new new dates and keep track of the run columns for identical dates.
var d=0;//delete counter
for(var i=1;i<vA.length;i++){
if(dObj.hasOwnProperty(vA[i][0])) {//if it does not have this property then it is a new date
dObj[vA[i][0]]=Number(dObj[vA[i][0]])+1;//if it does have this property then increment the DObj value which keeps track of the run column it will go into
var rg=sh.getRange(1,2 + Number(dObj[vA[i][0]]));//this is the header column cell for this dObj column
if(rg.isBlank()){//if it is blank then write a new one
rg.setValue('Run' + dObj[vA[i][0]]);
}
sh.getRange(Number(dObj.currentRow),2 + Number(dObj[vA[i][0]])).setValue(vA[i][1]);//put value for this line in the appropriate column in the currentRow
sh.deleteRow(i-d+1);//delete this line
d++;//increment the delete counter
}else{//it is a new date
dObj[vA[i][0]]=1;
dObj['currentRow']=i-d+1;//Current Data Row
var rg=sh.getRange(1,3);
if(rg.isBlank()){//if header has no label in the first run column then write it
rg.setValue('Run' + 1);
}
sh.getRange(Number(dObj.currentRow),2 + Number(dObj[vA[i][0]])).setValue(vA[i][1]);//write data in the appropriate column in this case it is always column3
}
}
sh.deleteColumn(2);
}
Пример электронной таблицы перед запуском сценария:
Пример электронной таблицы после запуска сценария:
значение в столбце 2 для каждой последовательной идентичной даты помещается в следующий столбец в первой строке, в которой эта дата появляется.В конце столбец 2 удаляется.
Я поиграл с этим, и для этой версии не требуются дополнительные идентичные даты, чтобы быть последовательными.Он создает уникальный currentRow для каждой даты, и эта текущая строка используется для всех оставшихся идентичных дат, даже если они происходят после других оставшихся дат.то есть даты не должны быть отсортированы.
function condenseDates(){
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('36');//you need to change this for the appropriate sheet name
var rg=sh.getDataRange();//get all data values including headers
var vA=rg.getValues();
var dObj={};//data object which is used to identify new new dates and keep track of the run columns for identical dates.
var d=0;//delete counter
for(var i=1;i<vA.length;i++){
if(dObj.hasOwnProperty(vA[i][0])) {//if it does not have this property then it is a new date
dObj[vA[i][0]]=Number(dObj[vA[i][0]])+1;//if it does have this property then increment the DObj value which keeps track of the run column it will go into
var rg=sh.getRange(1,2 + Number(dObj[vA[i][0]]));//this is the header column cell for this dObj column
if(rg.isBlank()){//if it is blank then write a new one
rg.setValue('Run' + dObj[vA[i][0]]);
}
sh.getRange(Number(dObj[vA[i][0].toString()+'currentRow']),2 + Number(dObj[vA[i][0]])).setValue(vA[i][1]);//put value for this line in the appropriate column in the currentRow
sh.deleteRow(i-d+1);//delete this line
d++;//increment the delete counter
}else{//it is a new date
dObj[vA[i][0]]=1;
dObj[vA[i][0].toString()+'currentRow']=i-d+1;//A unique Current Data Row for each date when additional identical dates will expand into additional columns.
var rg=sh.getRange(1,3);
if(rg.isBlank()){//if header has no label in the first run column then write it
rg.setValue('Run' + 1);
}
sh.getRange(Number(dObj[vA[i][0].toString()+'currentRow']),2 + Number(dObj[vA[i][0]])).setValue(vA[i][1]);//write data in the appropriate column in this case it is always column3
}
}
sh.deleteColumn(2);
}