0

Google Sheets API の Spreadsheets.values.update ( https://developers.google.com/sheets/reference/rest/v4/spreadsheets.values/update ) メソッドを使用してデータをスプレッドシートに挿入しようとしています。

スコープが正しく設定されたアクセス トークンを取得済みで、cURL 経由で PUT リクエストを送信しようとしています。私は PHP curl ラッパー ( https://github.com/php-curl-class/php-curl-class ) を使用していますが、プレーンな PHP も素晴らしいでしょう。

これが私がこれまでに持っているものです:

$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);
    }

cURL リクエストは正常に実行され、次のものが返されます。

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

ただし、シート内のデータは更新されません。

私が間違っていることを誰かが知っていますか?よろしくお願いします。

4

3 に答える 3

1

初めに:

  • $curl->setOpt(CURLOPT_POSTFIELDS, '{"values": [["Elizabeth", "2", "0.5", "60"]]}');通常の文字列を渡すことを呼び出しました。
    ただし、curlオプションは、その値を urlencoded 文字列やデータの連想配列 (キーと値のペア) のCURLOPT_POSTFIELDSように受け入れます。'para1=val1&para2=val2&...'

第二に:

  • putその library( php-curl-class)の関数はfunction put($url, $data = array()) ...、2 番目の引数をポスト データと見なします。
    メソッドを呼び出すときにデータの配列を渡したので、put以前の投稿データセットを上書きしました$curl->setOpt(CURLOPT_POSTFIELDS, ....
于 2016-06-25T16:03:31.293 に答える
0

OK、Postman ( https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en ) を介してパラメーターを実行し、次のコードをエクスポートしました。

$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;
}

そして、ついに機能します!RomanPerekhrest の提案によると、 content-type: application/json は絶対に不可欠です。リクエストはそれなしでは何も更新しません。

于 2016-06-25T17:35:43.023 に答える