0

J'ai écrit une fonction personnalisée [= ROUTEPLAN (origine, destination, mode, departuretime)] dans l'éditeur de script Google Sheets. La fonction attribue un identifiant unique à la requête, appelle l'API Google Maps Directions, transmet en paramètre les arguments listés dans la fonction, analyse le JSON et extrait la durée, la latitude finale et la longitude de fin pour chaque étape du trajet, puis ajoute une ligne pour chaque étape, le numéro d'étape séquentielle, la durée, la latitude de fin et la longitude de fin avec l'ID de la demande pour tout le voyage:Comment appendRow (ou écrire des données plus généralement) à Google Sheets à partir d'une fonction personnalisée

function ROUTEPLAN() { 

    //Call the google route planner api 
    //(variables for api declared here but removed for brevity) 
    var routeResponse = UrlFetchApp.fetch("https://maps.googleapis.com/maps/api/directions/json?origin=" + origin 
             + "&destination=" + destination 
             + "&mode=" + mode + 
             "&region=uk&departure-time=" + departuretime 
             + "&key=MYAPIKEY") 

    //Assign a unique ID to this request 
    var requestID = Date.now() + Math.random(); 

    //Parse JSON from routeResponse 
    var json = routeResponse.getContentText(); 
    var data = JSON.parse(json); 

    //Insert the RequestID, step number, duration, end Latitude and end Longitude for each step of the journey into the RouteDetails sheet 
    var steps = data["routes"][0]["legs"][0]["steps"]; 
    for (i = 0; i < steps.length; i++) { 
    var stepID = i + 1; 
    var duration = steps[i]["duration"]["value"]; 
    var endLat = steps[i]["end_location"]["lat"]; 
    var endLng = steps[i]["end_location"]["lng"]; 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName("RouteDetails") 
    sheet.appendRow([requestID,stepID,duration,endLat,endLng]);                             
    } 
} 

Ou du moins ce que je veux faire. Cela a bien fonctionné jusqu'à ce que je le bricole, et maintenant je reçois une erreur quand j'appelle la fonction dans la feuille de calcul, en me disant que je n'ai pas la permission d'appeler appendRow. Je sais pourquoi cela se produit (même si je ne comprends pas pourquoi ça ne se passait pas avant), mais je ne peux pas savoir ce que je suis censé faire à ce sujet. Si appendRow existe, il doit y avoir des circonstances dans lesquelles il peut être utilisé pour écrire des données sur la feuille, mais je ne peux pas comprendre les circonstances dans lesquelles l'autorisation d'écrire sur la feuille serait accordée.

Le but de la feuille est de fournir des données à un chatbot (l'application de chatbot a lu & des permissions d'écriture sur la feuille). Je n'ai pas l'intention de fournir un accès au-delà (c'est-à-dire que je n'ai pas l'intention de le publier pour une utilisation plus large). J'ai essayé de descendre la route de déclenchement installable, mais en dépit de suivre toutes les instructions qui n'ont fait absolument aucune différence pour le résultat. De la compréhension limitée que j'ai acquise en lisant sur API Executables, cela ne semble pas être une option non plus.

Quelqu'un peut-il me dire comment résoudre ce problème? Merci :-)

+0

Sans voir votre code, 'appendRow()' est une méthode 'Sheet', ce qui signifie que vous devez modifier la feuille elle-même, pas les données de la feuille. Publiez du code pertinent et vous aurez plus de chances d'obtenir une réponse. – Brian

Répondre

2

Une fonction personnalisée ne peut pas modifier la structure de la feuille de calcul, afin d'appeler appendRow() n'est pas autorisé comme indiqué dans le documentation:

Une fonction personnalisée ne peut pas affecter les cellules autres que celles qu'elle retourne une valeur à. En d'autres termes, une fonction personnalisée ne peut pas éditer des cellules arbitraires, seulement les cellules à partir desquelles elle est appelée et leurs cellules adjacentes. Pour modifier des cellules arbitraires, utilisez un menu personnalisé pour exécuter une fonction à la place

Si vous souhaitez renvoyer plusieurs lignes de votre fonction, vous devez renvoyer un tableau bidimensionnel. Notez cependant que les fonctions personnalisées ont la même limitation que les fonctions natives de ne pas pouvoir écraser le contenu, c'est-à-dire que si vous essayez de renvoyer deux lignes mais que la ligne ci-dessous est déjà remplie, la fonction expirera.