2017-10-19 25 views
-1

Ce programme fonctionne parfaitement, sauf si vous obtenez une ligne de données. Il attrape toujours un ensemble vide. Quelqu'un voit-il ce qui me manque? Il devrait être simple de copier et coller une rangée idiote..getValues ​​() ne fonctionne pas si les valeurs sont créées par la formule Google Apps Script

J'ai besoin de saisir les données de D: BA dans la ligne éditée. Ensuite, supprimez la formule qui a créé les données, puis collez les données enregistrées dans la ligne pour pouvoir les personnaliser.

function onEdit(e) { 
    if(e.range.columnStart != 1 || 
    e.source.getActiveSheet().getName() != "Loads") 
    /*e.source.getActiveSheet().getName() != "Loads") || 
    e.range.rowStart != 9 || e.range.columnStart != 1 || 
    e.range.rowEnd != 53 || 
    e.range.columnEnd != 1*/ 
    ){ 
    return; 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName("Loads"); 
    var arr = []; 
    var r = e.range.getRow(); 
    var cell1 = sheet.getRange(r,1); 
    var cell2 = sheet.getRange(r,2); 
    var lastColumn = sheet.getLastColumn(); 
    var row = sheet.getRange(r,4,49,49); 
    var value = e.value; 
    var arr = []; 

    // get cell 2 
    var cell2value = cell2.getValue(); 
    // delete cell 
    cell2.clear(); 
    //paste formula 
    cell2.setFormula('=split(REGEXREPLACE(A'+r+',\",\",\", \"),\",\",true)'); 

    // copy row r,3,1,40 
    //var row2 = sheet.getRange(r,4,1,10); 
    var rowValues = row.getValues(); 

    //push row values to array 
    arr.push(rowValues); 
    // clear e.range 
    cell1.clear(); 
    // delete cell 
    cell2.clear(); 
    // paste cell 
    //cell2.setValue(cell2value); 
    // paste row 
    row.setValues(arr); 
    } 
}; 
+0

Première impression: Êtes-vous sûr qu'il fonctionne? Votre condition 'if()' n'a pas 'else', donc si elle est vraie, elle appelle' return' et ne vous donne rien, et il n'y a rien à exécuter si la condition est évaluée à false. –

Répondre

0

D'abord, votre logique ne sera exécuté: si votre état if() évalue à true, onEdit(e) exécute return & rien ne se passe, sinon (quand if() est évaluée à false) il n'y a aucun autre code à exécuter. Vous voulez probablement dire if(!foo){ return; }, sinon vous devez ajouter une clause else. En outre, votre condition if() sera évaluée à true si, par exemple, la cellule A1 sur une feuille autre 'Loads' est modifiée: je ne suis pas sûr que ce soit ce que vous voulez. Vous pouvez utiliser AND logique ici.

Ensuite, vous saisissez uniquement les données de votre feuille 'Charges': vous ne faites jamais référence à la ligne dans la feuille modifiée. Vous avez probablement besoin de 2 objets feuille: un pour la feuille qui a été éditée, que vous pouvez obtenir avec ss.getActiveSheet() & la seconde pour 'Charges'.

Vous saisissez également un tableau 49x49 lorsque vous appelez sheet.getRange(), ce qui signifie que vos appels range.getValues() renvoient également un tableau de valeurs de 49x49, ce qui n'est pas ce que votre description dit vouloir faire. Voulez-vous dire sheet.getRange(r,4,1,49)? (Qui retourne un tableau de 1x49.)

arr.push(rowValues) complique les choses en poussant votre tableau 2D rowValues dans un nouvel élément de tableau dans arr[], ce qui arr[] un tableau 3D (arr[0] contient le tableau de 49x49 rowValues). Si vous devez copier rowValues dans une autre variable, attribuez-le simplement: var arr = rowValues;

Etes-vous en train d'effacer le formulaire de formule cell2? Si c'est le cas, vous devez définir une formule vide, car range.clear() laisse les formules intactes.

Tout le reste semble bien fonctionner, mais je ne sais pas exactement ce que vous essayez de faire. J'espère que cela aide, tho.

+0

Je voudrais souligner que le problème n'est pas l'absence d'une clause «else». Vous pouvez avoir un 'if()' sans 'else' et bien fonctionner, le problème est là où se trouve le crochet. Ma compréhension qu'il veut faire un 'if (/ * raisons * /) {return}' qui est tout à fait normal si vous voulez tuer la fonction si les conditions sont remplies. – Vytautas

+0

Merci, @Vytautas, vous avez absolument raison. Je ne sais pas pourquoi je ne l'ai pas regardé de ce point de vue: le tien est une bien meilleure explication du problème du «retour». J'ai mis à jour ma réponse pour inclure votre point de vue. –

+0

Merci les gars, oui la clause if semble bien fonctionner. – Clayten