2016-06-25 9 views
0

Ich versuche, die Tabellenkalkulation.values.update Methode (https://developers.google.com/sheets/reference/rest/v4/spreadsheets.values/update) der Google Tabellen-API zu verwenden, um Daten in eine Tabelle einzufügen.Einstellung PUT Anfragekörper mit PHP

Ich habe bereits ein Access-Token mit korrektem Umfang erworben, und jetzt versuche ich, eine PUT-Anfrage über cURL zu senden. Ich benutze den PHP curl wrapper (https://github.com/php-curl-class/php-curl-class), aber einfaches PHP wäre auch großartig.

Hier ist, was ich bisher:

$curl = new Curl(); 
    $curl->setHeader("Authorization","Bearer ".json_decode($a4e->user->google_token)->access_token); 
    $curl->setOpt(CURLOPT_POSTFIELDS, '{"values": [["Elizabeth", "2", "0.5", "60"]]}'); 
    $curl->put('https://sheets.googleapis.com/v4/spreadsheets/11I1xNv8cHzBGE7uuZtB9fQzbgrz4z7lIaEADfta60nc/values/Sheet1!A1', array(
     'valueInputOption' => 'USER_ENTERED'  
    )); 

    if ($curl->error) { 
     echo 'Error: ' . $curl->errorCode . ': ' . $curl->errorMessage; 
    } 
    else { 
     echo json_encode($curl->response); 
    } 

Die cURL Anfrage erfolgreich ausgeführt und gibt die folgende:

{ "spreadsheetId": "11I1xNv8cHzBGE7uuZtB9fQzbgrz4z7lIaEADfta60nc", "updatedRange": "Sheet1 ! A1 "}

Die Daten im Blatt werden jedoch nicht aktualisiert.

Weiß jemand, was ich falsch mache? Vielen Dank im Voraus.

Antwort

0

OK, so lief ich die Parameter durch Postman (https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en) und exportierte den folgenden Code:

$curl = curl_init(); 

curl_setopt_array($curl, array(
    CURLOPT_URL => "https://sheets.googleapis.com/v4/spreadsheets/11I1xNv8cHzBGE7uuZtB9fQzbgrz4z7lIaEADfta60nc/values/Sheet1!A1?valueInputOption=USER_ENTERED", 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_ENCODING => "", 
    CURLOPT_MAXREDIRS => 10, 
    CURLOPT_TIMEOUT => 30, 
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, 
    CURLOPT_CUSTOMREQUEST => "PUT", 
    CURLOPT_POSTFIELDS => "{\"range\":\"Sheet1!A1\",\"majorDimension\":\"ROWS\",\"values\":[[\"x\",\"x\",\"x\",\"x\",\"x\"]]}", 
    CURLOPT_HTTPHEADER => array(
    "authorization: Bearer {token}", 
    "cache-control: no-cache", 
    "content-type: application/json", 
), 
)); 

$response = curl_exec($curl); 
$err = curl_error($curl); 

curl_close($curl); 

if ($err) { 
    echo "cURL Error #:" . $err; 
} else { 
    echo $response; 
} 

Und es funktioniert endlich! Der Inhaltstyp: application/json ist laut RomanPerekrests Vorschlag unbedingt erforderlich. Die Anfrage aktualisiert nichts ohne sie.

1

Ich nehme an, Sie sind erfolgreich mit OAuth authentifiziert? Ich würde in Ihre Put-URL schauen. Sie sagen "Sheet1! A1", aber Sie geben Daten ein, die so aussehen, als würden sie sich über mehrere Zellen erstrecken. Also würde ich versuchen, "Sheet1! A1" anzupassen, um eine tatsächliche Wut von Zellen einzuschließen, da Sie viele Daten haben, die Sie importieren. Normalerweise sollte die Antwort ähnlich aussehen wie this. Da es in Ihrer Antwort keine dieser letzten Informationen enthält, sieht es so aus, als seien die Zellen, auf die Sie schreiben wollen, nicht korrekt.

+0

Hallo, vielen Dank für den Kommentar. Ja, die Authentifizierung ist erfolgreich und ich kann Daten problemlos aus derselben Tabelle lesen. Die Migrationsdokumente hier (https://developers.google.com/sheets/guides/migration#add_a_new_row_of_data) sagen: "Der angegebene Bereich muss sich nur auf die erste Zelle in der Zeile beziehen. Die API leitet die zu aktualisierenden Zellen basierend auf den Werten weiter mit der Anfrage versehen."Also ich denke nicht, dass das ein Problem sein sollte. – praine

1

Zunächst:

  • haben Sie $curl->setOpt(CURLOPT_POSTFIELDS, '{"values": [["Elizabeth", "2", "0.5", "60"]]}'); in einem regulären String übergeben genannt.
    Aber curl CURLOPT_POSTFIELDS Option akzeptiert es Wert ist urlencoded String wie 'para1=val1&para2=val2&...' oder assoziative Array von Daten (Schlüssel/Wert-Paaren)

Zweitens werden:

  • die put Funktion aus dieser Bibliothek (php-curl-class) function put($url, $data = array()) ... betrachtet sein zweites Argument als post Daten.
    Wie Sie in einer Reihe von Daten übergeben, wenn put Methode aufrufen - Sie haben überschreiben früheren Post-Datensatz von $curl->setOpt(CURLOPT_POSTFIELDS, ....
+0

Hallo, danke für Ihre Hilfe. Die API erfordert einen einzigen Abfrageparameter gesetzt werden," valueInputOption ", die ich mit dem zweiten Argument in der PHP versuchen, zu setzen -curl-class-Funktion Es scheint aber auch eine JSON-codierte Zeichenfolge im BODY der PUT-Anfrage zu benötigen .. Ich bin mir nicht sicher, wie ich diese beiden Elemente in meine Anfrage aufnehmen kann. – praine

+0

wenn es "einen JSON benötigt codierte Zeichenfolge im BODY der PUT-Anfrage. "Haben Sie versucht, das Array' array ('valueInputOption' => '{"Werte": [["Elizabeth", "2", "0.5", "60"] ]} ')) 'als zweites Argument für die' put'-Funktion? – RomanPerekhrest

+0

"valueInputOption" muss einer der folgenden sein: "RAW" oder "USER_ENTERED" (gemäß: https://developers.google.com/sheets/reference/rest/v4/ValueInputOption) – praine