0

Je souhaite expérimenter Google Datastore via Apps Script, car ma solution actuelle basée sur des feuilles Google rencontre des problèmes de dépassement de temps inhérents aux transactions constantes avec les fichiers Drive. J'ai créé un projet de test dans Google Cloud avec un compte de service et activé la bibliothèque MZx5DzNPsYjVyZaR67xXJQai_d-phDA33 (cGoa) pour gérer le travail Oauth2. J'ai suivi le guide pour le démarrer here et j'ai obtenu toute la confirmation pertinente que cela fonctionne avec mon jeton (et que la suppression du jeton déclenche une 'authentification échouée').Utiliser Apps Script URLFetchApp pour accéder aux données du magasin de données Google

Maintenant, je veux commencer par une requête de base pour afficher une entité I déjà mis en je peux utiliser l'API Explorateur here et exécuter ce corps de requête.

{ 
    "query": {} 
} 

et obtenir ce résultat:

{ 
"batch": { 
"entityResultType": "FULL", 
"entityResults": [ 
    { 
    "entity": { 
     "key": { 
     "partitionId": { 
      "projectId": "project-id-5200707333336492774" 
     }, 
     "path": [ 
      { 
      "kind": "Transaction", 
      "id": "5629499534213120" 
      } 
     ] 
     }, 
     "properties": { 
     "CommentIn": { 
      "stringValue": "My First Test Transaction" 
     }, 
     "Status": { 
      "stringValue": "Closed" 
     }, 
     "auditStatus": { 
      "stringValue": "Logged" 
     }, 
     "User": { 
      "stringValue": "John Doe" 
     }, 
     "Start": { 
      "timestampValue": "2017-08-17T18:07:04.681Z" 
     }, 
     "CommentOut": { 
      "stringValue": "Done for today!" 
     }, 
     "End": { 
      "timestampValue": "2017-08-17T20:07:38.058Z" 
     }, 
     "Period": { 
      "stringValue": "08/16/2017-08/31/2017" 
     } 
     } 
    }, 
    "cursor": "CkISPGogc35whh9qZWN0LWlkLTUyMDA3MDcwODA1MDY0OTI3NzRyGAsSC1RyYW5zYWN0aW9uGICAgICAgIAKDBgAIAA=", 
    "version": "1503004124243000" 
    } 
], 
"endCursor": "CkISPGogc35wcm9qZWN0LWlkLTUyMDAxxDcwODA1MDY0OTI3NzRyGAsSC1RyYW5zYWN0aW9uGICAgICAgIAKDBgAIAA=", 
"moreResults": "NO_MORE_RESULTS" 
} 
} 

J'essaie de faire la même chose avec ce code:

function doGet(e) 
    { 
    var goa = cGoa.GoaApp.createGoa('Oauth2-Service-Account', 

    PropertiesService.getScriptProperties()).execute(e); 
    if(goa.hasToken()) {var token = goa.getToken();} 

     var payload = {"query":{}} 
      ; 

     var result = UrlFetchApp.fetch('https://datastore.googleapis.com/v1/projects/project-id-5200707333336492774:runQuery', 
        { 
         method: "POST", 
         headers: {authorization: "Bearer " + goa.getToken()}, 
     muteHttpExceptions : true, 
         payload: payload 
        }); 



     Logger.log(result.getBlob().getDataAsString()); 
      } 

et obtenir cet e rror dans l'enregistreur:

"error": { 
    "code": 400, 
    "message": "Invalid JSON payload received. Unknown name \"query\": Cannot bind query parameter. 'query' is a message type. Parameters can only be bound to primitive types.", 
    "status": "INVALID_ARGUMENT", 
    "details": [ 
     { 
     "@type": "type.googleapis.com/google.rpc.BadRequest", 
     "fieldViolations": [ 
      { 
      "description": "Invalid JSON payload received. Unknown name \"query\": Cannot bind query parameter. 'query' is a message type. Parameters can only be bound to primitive types." 
      } 
     ] 
     } 
    ] 
    } 
} 

Si je tente d'utiliser un autre mot comme « ressource » ou « GqlQuery », je reçois cette erreur:

"error": { 
    "code": 400, 
    "message": "Invalid JSON payload received. Unknown name \"GqlQuery\": Cannot bind query parameter. Field 'GqlQuery' could not be found in request message.", 
    "status": "INVALID_ARGUMENT", 
    "details": [ 
     { 
     "@type": "type.googleapis.com/google.rpc.BadRequest", 
     "fieldViolations": [ 
      { 
      "description": "Invalid JSON payload received. Unknown name \"GqlQuery\": Cannot bind query parameter. Field 'GqlQuery' could not be found in request message." 
      } 
     ] 
     } 
    ] 
    } 
} 

Je ne peux pas dire de l'API Documentation ce que ma syntaxe est supposée être. Quelqu'un peut-il me dire comment compiler un corps de requête fonctionnel d'Apps Script à Datastore?

+0

également: L'exécution de la requête avec un corps vide crée cette réponse: « erreur »: { "code": 400, "message": "l'un des champs Query.query et Query.gql_query doit être réglé", "statut": "Invalid_argument" }} –

Répondre

1

Vous devez définir le contentType de votre charge utile ainsi que stringify votre charge utile JSON comme suit:

var result = UrlFetchApp.fetch(
    'https://datastore.googleapis.com/v1/projects/project-id-5200707333336492774:runQuery', 
    { 
     'method':'post', 
     'contentType':'application/json', 
     'headers': {authorization: "Bearer " + goa.getToken()}, 
     'payload':JSON.stringify(payload) 
    } 
); 
+0

Vous l'avez fait, Designs DIMU! Merci! Cela fonctionne bien maintenant! Alors, y a-t-il une référence pour cette API que je n'ai pas trouvée? La page de l'API de Google n'a pas été très claire ... –

+0

L'envoi de requêtes et la réception de réponses via HTTP sont universels pour le développement web en général, de sorte que la documentation d'Apps Script le survole un peu. Mais il couvre un peu le sujet sous la documentation UrlFetchApp: https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app –

+0

Si vous voulez vraiment approfondir le sujet vous pouvez essayer d'aborder le guide suivant: https://code.tutsplus.com/tutorials/http-the-protocol-every-web-developer-must-know-part-1--net-31177 C'est beaucoup à mâcher, mais vous repartirez avec une meilleure compréhension de la façon dont http fonctionne une fois que vous vous débrouillez. –