3

Google スプレッドシート API や Zend_GData クラスの経験があるかどうかはわかりませんが、試してみる価値はあります。

750 行のスプレッドシートに値を挿入しようとすると、時間がかかり、メモリ制限 (128 MB です!) を超えたというエラーがスローされます。このスプレッドシートのすべてのレコードをクエリしたときにもこれが得られましたが、これは非常に多くのデータであるため、画像化できます。しかし、なぜ行を挿入するときにこれが起こるのでしょうか? 複雑すぎませんか?使用したコードは次のとおりです。

public function insertIntoSpreadsheet($username, $password, $spreadSheetId, $data = array()) {
    $service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
    $client = Zend_Gdata_ClientLogin::getHttpClient($username, $password, $service);
    $client->setConfig(array( 'timeout' => 240 ));
    $service = new Zend_Gdata_Spreadsheets($client);
    if (count($data) == 0) {
        die("No valid data");
    }
    try {
        $newEntry = $service->insertRow($data, $spreadSheetId);
        return true;
    } catch (Exception $e) {
        return false;
    }
}
4

3 に答える 3

4

私は今日これに出くわしました。メソッドを呼び出すとinsertRow()、私のスクリプトは 130MB 以上のメモリを使用して、最大 600 レコードのワークシートに挿入されました。これをフレームワーク バージョン 1.11でテストしました。

回避策として、既存の Zend HTTP クライアント オブジェクトを使用して、挿入する行のデータを含む Atom エントリを含む POST を送信します。リスト行を追加するための Google のプロトコルに従いました。

以下は私が思いついたコードです。パラメータは、行の$values列名と一致するキーを持つ連想配列です。もちろん、あなたはすでにあなたの$spreadsheetKeyand を知っています$worksheetId(挿入しようとしているワークシートがスプレッドシートの最初のワークシートである場合、その ID が必要かどうかはわかりません)。

$authService = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
$httpClient = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $authService);

function insertRow($httpClient, $spreadsheetKey, $worksheetId, $values) {
    $entry = createEntry($values);
    $httpClient->setUri("https://spreadsheets.google.com/feeds/list/".$spreadsheetKey."/".$worksheetId."/private/full");
    $response = $httpClient->setRawData($entry, 'application/atom+xml')->request('POST');
    return $response->getStatus() == 201;
}

function createEntry($values) { 
    $entry = "<entry xmlns=\"http://www.w3.org/2005/Atom\"";
    $entry .= " xmlns:gsx=\"http://schemas.google.com/spreadsheets/2006/extended\">";
    foreach($values as $key => $value) {
        $entry .= "<gsx:".$key.">".$value."</gsx:".$key.">";
    }
    $entry .= "</entry>";
    return $entry;
}

お役に立てれば。

于 2010-11-03T20:03:18.267 に答える
1

申し訳ありませんが、ジョナサン・フリーランドの投稿にコメントできないので、このように投稿します。

これをinsertRow()内に追加して、機能させました。

$token = $httpClient->getClientLoginToken();
$httpClient->setHeaders('Authorization','GoogleLogin auth='.$token);
$httpClient->setHeaders('Content-Type', 'application/atom+xml');
于 2010-12-09T09:39:28.563 に答える
0

これは Zend_Gdata の深刻なバグです。スプレッドシート全体を(空のクエリを実行して)ダウンロードし、メモリにロードして、挿入用のリクエスト URL を作成します。この問題と修正を報告しましたが、この問題は Zend のメンテナによって無視されており、修正されない可能性があります。

于 2011-03-29T15:53:52.470 に答える