2013-05-05 4 views
1

Voici ma fonction pour importer une plage (6 colonnes et beaucoup de lignes) à partir de la feuille de calcul active et du sous-total de retour regroupés par la 5ème colonne.Script Google Spreadsheet pour renvoyer la table des sous-totaux

var sheet = SpreadsheetApp.getActiveSheet(); 
var rows = sheet.getRange("A3:F"); 
var values = rows.getValues(); 
var expense = new Array(); 
var expensehead = new Array(); 
for (var i = 0, e = 0; i <= rows.getNumRows()-1; i++) { 

    if (values[i][0] instanceof Date & values[i][2] == "Expense") { // As long as col0 is a date and col2 == "Expense" 
     if (expense.hasOwnProperty(values[i][4])) { 
     // if the index "Expense Category" (col4) already exists in the array, add the amount (col 5) to the existing value 
     // Add amount (col 5) array expense where index is "Expense Category" (col4) 
     // For example Expense['Food'] = Expense['Food'] + 100; Emulating it like an associative array here 
     expense[values[i][4]]= expense[values[i][4]] + values[i][5]; 
     } 
     else { 
     // The index "Expense Category" (col4) does already exists in the array, assign the amount (col 5) to the new index 
     // Add amount (col 5) array expense where index is "Expense Category" (col4) 
     // For example Expense['Food'] = 100; I have spet on food for the first time, hence it does not exist in the array already. Emulating it like an associative array here 
     expense[values[i][4]]= values[i][5]; 

     //Since Javascript or Google script does not support iteration in an associative array, 
     //I am adding all indexes to another array expensehead so i will be able to pull out the info later. 
     expensehead.push(values[i][4]) 
     } 
    } 
    } 

Mon problème:

Je sais que l'utilisation de tableau est une mauvaise idée ici. Je veux utiliser quelque chose comme une paire de valeur de clé 2D ou un tableau associatif (ou un objet équivalent de feuille de calcul)

Quelqu'un peut-il me diriger vers un objet de feuille de calcul Google que je peux utiliser et également indiquer des méthodes par lesquelles peuvent retourner les 2 colonnes PS1: Je ne veux pas utiliser le rapport du tableau croisé dynamique car je vais introduire des filtres basés sur la date supplémentaires que le tableau croisé dynamique ne prend pas en charge. (Voir ci-dessous) PS2: Je suis un sous-total de la catégorie de dépenses et du sous-total. actuellement en utilisant la fonction intégrée "query" de la feuille de calcul (voir ci-dessous) mais je ne l'aime pas parce qu'elle ne peut pas me donner le total général des sous-totaux comme les Pivots = query (A2: F; "SELECT SUM (F), D où C comme 'Dépenses' ET A> = date '"& mkdate (I1) & "'ET A mkdate (L1) &"' grouper par D Trier par SUM (F) Étiquette SUM (F) 'Montant', D 'Catégorie de dépense' ") PS3 : J'ai envisagé d'utiliser une requête Sql comme ci-dessus et d'exécuter un tableau croisé dynamique pour générer des sous-totaux, mais je me sens comme un perdant. En outre, j'ai environ 1000 lignes dans les données qui le rend super lent.

Toute aide serait grandement appréciée.

Répondre

0

Si vous souhaitez utiliser des objets/tableaux associatifs au lieu d'un tableau javascript, jetez un oeil à la ObjService Library. Vous pourriez alors faire quelque chose comme ceci:

... 
var expense = ObjLib.rangeToObjects(values); 

for (var i in expense) { 
    if (expense[i].expenseCategory != null) { 
    ... 
    } 
} 
1

J'ai construit une fonction qui peut aider. J'ai un ensemble de fonctions d'aide que j'utilise dans beaucoup de mes feuilles de calcul. Mais c'est ici.

Utilisation:

var DistNTax = SpreadsheetApp .openById(SheetID) .getSheetByName('Sheet1') .getRange('N2:S') .getValues();

var DistNTax = SumColArray_(DistNTax);

for (var d = 0,LOCNUML=LocNum.length; d < LOCNUML; d++)         //Builds 2d Looping-Array to allow choosing of columns at a future point 
      { 
      SpreadsheetApp.getActive().getSheetByName('Database').getRange(CurrentEmpty + d,1).setValue(FuncName); //getRange(Row,Col,RowAdd,ColAdd) 
      SpreadsheetApp.getActive().getSheetByName('Database').getRange(CurrentEmpty + d,2).setValue(TimeFrame); //getRange(Row,Col,RowAdd,ColAdd) 
      SpreadsheetApp.getActive().getSheetByName('Database').getRange(CurrentEmpty + d,5).setValue(DistNTax[d]); //getRange(Row,Col,RowAdd,ColAdd) 
      } 

//~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~` 
//--//Dependent on cleanArray_() 
// Array Column Sum Agent 
function SumColArray_(sumagent) 
{ 
    var newArray = new Array(); 
    for(var i = 0, sL = sumagent.length; i<sL; i++) 
    { 
     var totalsum = 0 
     var CleanForSum = cleanArray_(sumagent[i]); 
     for(var d = 0, CFSL = CleanForSum.length; d<CFSL; d++) 
     { 
     totalsum += CleanForSum[d]; 
     } 
     newArray.push(Math.round(totalsum)); 
    } 
    return newArray; 
} 
//~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~` 



//~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~` 
//--//Dependent on isEmpty_() 
// Blank Array Extractor/Rebuilder 
function cleanArray_(actual) 
{ 
    var newArray = new Array(); 
    for(var i = 0, aL = actual.length; i<aL; i++) 
    { 
     if (isEmpty_(actual[i]) == false) 
     { 
      newArray.push(actual[i]); 
     } 
    } 
    return newArray; 
} 
//~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~` 



//~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~` 
// Empty String Check 
function isEmpty_(string) 
{ 

    if(!string)    return true;   
    if(string == '')  return true; 
    if(string === false) return true; 
    if(string === null)  return true; 
    if(string == undefined) return true; 
    string = string+' '; // check for a bunch of whitespace 
    if('' == (string.replace(/^\s\s*/, '').replace(/\s\s*$/, ''))) return true;  
    return false;   
} 
//~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~`~,~` 
Questions connexes