J'essaie de créer une fonction dans Sheets qui combine une combinaison "Vlookup" et "Match" que j'utilise fréquemment.
Je souhaite utiliser ma fonction "Rates" pour accepter 1 argument et renvoyer une combinaison de Vlookup et Match, qui utilise toujours les mêmes valeurs.
Vlookup (argument, DEFINED RANGE (reste toujours la même plage définie), match (A1 (toujours cellule A1), DIFFERENT DEFINED RANGE, 0), FALSE)
J'ai essayé de créer un script, mais je n'ai aucune expérience de codage, et je reçois un message d'erreur indiquant que "vlookup n'est pas défini"
function ratesearch(service) { return vlookup(service, Rates, Match($A$1,RatesIndex,0),FALSE); }
Réel résultats: #ERROR!
ReferenceError: "vlookup" n'est pas défini. (ligne 2).
3 Réponses :
vlookup n'est pas quelque chose que vous pouvez utiliser dans une fonction dans un script, c'est une formule de feuille de calcul.
Les scripts Google utilisent JavaScript, vous devrez donc écrire votre code dans JS puis le générer dans une cellule appropriée.
Si vous pouviez partager votre feuille / script, nous pourrions vous aider à le comprendre.
function findRate() { var accountName = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(1,1).getValue(); //determine the account name to use in the horizontal search var rateTab = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Rates'); //hold the name of the rate tab for further dissection var rateNumColumns =rateTab.getLastColumn(); //count the number of columns on the rate tab so we can later create an array var rateNumRows = rateTab.getLastRow(); //count the number of rows on the rate tab so we can create an array var rateSheet = rateTab.getRange(1,1,rateNumRows,rateNumColumns).getValues(); //create an array based on the number of rows & columns on the rate tab var currentRow = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getActiveCell().getRow(); //gets the current row so we can get the name of the rate to search var rateToSearch = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(currentRow,1).getValue(); //gets the name of the rate to search on the rates tab for(rr=0;rr<rateSheet.length;++rr){ if (rateSheet[rr][0]==rateToSearch){break} ;// if we find the name of the } for(cc=0;cc<rateNumColumns;++cc){ if (rateSheet[0][cc]==accountName){break}; } var rate = rateSheet[rr][cc] ; //the value of the rate as specified by rate name and account name return rate; }
Points d'optimisation pour la réponse d'Alex :
var
, const
ou let
( rr
et cc
). Si vous omettez le mot-clé, les variables seront globales et vous causeront beaucoup de problèmes (car elles ne seront pas réinitialisées une fois la boucle terminée). Le meilleur moyen est d'utiliser let
à portée de bloc. rateSheet [rr] [cc]
). SpreadsheetApp.getActiveSpreadsheet ()
plusieurs fois - c'est à cela que servent les variables. Appelez une fois, puis réutilisez. getRange (1,1, , )
équivaut à un seul appel getDataRange
. find code>
ou méthode findIndex
pour éviter les boucles verbeuses. Avec les points appliqués, vous obtenez une fonction propre et optimisée à utiliser:
const findRate = () => { const ss = SpreadsheetApp.getActiveSpreadsheet(); const accountName = ss.getActiveSheet().getRange(1, 1).getValue(); const rateTab = ss.getSheetByName("Rates"); const rates = rateTab.getDataRange().getValues(); const currentRow = ss.getActiveSheet().getActiveCell().getRow(); var rateToSearch = ss.getActiveSheet().getRange(currentRow, 1).getValue(); const rr = rates.findIndex((rate) => rate === rateToSearch); const [firstRates] = rates; const cc = firstRates.findIndex((rate) => rate === accountName); return rates[rr][cc]; };
Notez que le "vlookup" est L'erreur non définie
indique qu'il n'y a pas de déclaration de variable / fonction vlookup
dans la portée. Ce qui est évidemment le cas car il n'y a pas de fonction intégrée de script Google Apps vlookup
.