Соотношение новых и повторных абонентов
Предполагая, что даты указаны в столбце 1, а номера телефонов - в столбце 2.Это также позволит экспортировать абонентов, впервые звонивших и повторяющих вызовы, на два других листа (дата и номер).Вы можете сэкономить время, отсортировав их в электронной таблице, а затем запустив код без сортировки.
function getRatioOfNewToRepeatCallers() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('Callers');
var rg=sh.getRange(2,1,sh.getLastRow()-1,sh.getLastColumn());//Assuming a one row header
var vA=rg.getValues();
var newCallers=[];
var newDC=[];
var repeated=[];
rg.sort({column:1,ascending:true});
for(var i=0;i<vA.length;i++) {
if(newCallers.indexOf(vA[i][1])==-1) {
newCallers.push(vA[i][1]);//new callers array date and number
newDC.push([vA[i][0],vA[i][1]]);
}else{
repeated.push([vA[i][0],vA[i][1]]);//repeated callers array date and number
}
}
exportToSheet({dataA:newDC,sheetname:'New Callers'});
exportToSheet({dataA:repeated,sheetname:'Repeated Callers'});
Logger.log(newCallers.length/repeated.length);
return newCallers.length/repeated.length;
}
function sheetExists(sheetname) {
var ss=SpreadsheetApp.getActive();
var allshts=ss.getSheets();
var exists=false;
for(var i=0;i<allshts.length;i++) {
if(allshts[i].getName()==sheetname) {
exists=true;
break;
}
}
return exists;
}
function exportToSheet(exportObj) {
var ss=SpreadsheetApp.getActive();
var sh;
if(!sheetExists(exportObj.sheetname)){
var sh=ss.insertSheet(exportObj.sheetname);
}else{
var sh=ss.getSheetByName(exportObj.sheetname);
}
sh.clear();
sh.appendRow(['Date','Number']);
sh.getRange(2,1,exportObj.dataA.length,2).setValues(exportObj.dataA);
}