【问题标题】:google sheets api v4 update row where id equals valuegoogle sheet api v4更新id等于值的行
【发布时间】:2019-07-31 11:26:10
【问题描述】:

我在列 A (ID) 中为每一行提供了一个 ID。 现在我想更新一行,其中 A 列的 ID 等于我的代码中的 ID。
在旧的 v3 版本 (+ a wrapper) 中,我可以使用此代码轻松搜索行并 row.save() 它:

var row = await promisify(sheet.getRows)({
    offset: 1,
    query: 'id = ' + user.id
});

但我在 v4 中找不到类似的东西。我发现的唯一问题是this Answere from 2017 可以解决此问题,但这意味着我需要编写一个单元格,读取该单元格的值,删除该单元格,然后使用该单元格中的值读取我真正想要的行然后用更新的数据覆盖该行。

目前有更简单的方法吗?

【问题讨论】:

  • 我无法理解(+ a wrapper)。你能提供更多关于你的脚本的信息吗?
  • 感谢您的回复。不幸的是,即使使用 Sheets API v4,也无法通过一次 API 调用来完成值的搜索和放置。检索和放置值至少需要 2 次 API 调用。对于这种情况,我深表歉意。
  • 感谢您的快速回复。在你的情况下,这个流程怎么样? 1. 使用电子表格.values.get 和电子表格.values.batchGet 检索值。这里使用一个 API。 2. 使用脚本从检索到的值中检索所需的值和索引。 3. 将带有电子表格.values.update 和电子表格.values.batchUpdate 的值作为更新。这里使用一个 API。您可以通过 Node.js 的 googleapis 使用 Sheets API。通过这个,我认为你的目标可以实现。如果您需要示例脚本,请随时告诉我们。
  • 我认为您的回复是正确的。
  • 我觉得剧本不错。我很高兴你的问题得到了解决。所以我想赞成它。如果您的问题已解决,请接受。这对有同样问题的其他用户很有用。

标签: node.js google-sheets google-sheets-api


【解决方案1】:

我目前有这个解决方案。

如果有人知道更短或更好的方法,请也在这里发布答案。

function UpdateRow() {
//Get all Rows
Sheets.spreadsheets.values.get({
    spreadsheetId: "XXXXXXXXXXXXXXXXXXX",
    range: "Tabellenblatt1!A:J"
}, (err, result) => {
    if (err) {
        console.log(err);
    } else {
        const numRows = result.data.values ? result.data.values.length : 0;
        console.log(`${numRows} rows retrieved.`);
        source = result.data.values;
        //Filter all rows except the one where the first column (A) equals my id + creates a new entry with the old index at [0]
        const input = source.map(function (row, index) {
            row.unshift(index);
            return row;
        }).filter(function (iRow) {
                return iRow[1] === "438065329533353986";
            });
        var index = parseInt(input[0]) + 1; //Saves the old index
        input[0].shift(); //Removes the old index from the array

        input[0][2] = "TEST"; //Update the row with stuff

        let values = [
            input[0]
        ];
        const resource = {
            values
        };
        Sheets.spreadsheets.values.update({
            spreadsheetId: "XXXXXXXXXXXXXXXXXXX",
            range: "Tabellenblatt1!A" + index + ":J" + index, //Saves the row at the old index from before
            valueInputOption: "RAW",
            resource : resource
        }, (err, result) => {
            if (err) {
                console.log(err);
            } else {
                console.log('%d cells updated.', result.data.updatedRows);
            }
        });
    }
});
}

【讨论】:

    【解决方案2】:

    我的窍门是用行号创建一个列。以这种方式,每次添加新行时,您必须向该单元格添加值 '=row'

    其次我使用google可视化查询来检查条件(https://developers.google.com/chart/interactive/docs/querylanguage)。

    最后,我根据条件为真的行更新数据表。

    我在 PHP 中的解决方案:

    require dirname(__FILE__).'/google-api-client/vendor/autoload.php';
    $secret_file_path = dirname(__FILE__).'/secret_file.json';
    
    $client = new Google_Client();
    $client->setAuthConfig($secret_file_path);
    $client->addScope(array(Google_Service_Sheets::SPREADSHEETS_READONLY, Google_Service_Sheets::SPREADSHEETS));
    
    $access_token = $client->fetchAccessTokenWithAssertion()["access_token"];   
    
    $service = new Google_Service_Sheets($client);  
    $gsheetId = '1VdXw5LrQDZYclimloMr1PfGjIRxjztiXVva1M0pXix';
    $params = [
        'valueInputOption' => "USER_ENTERED"    // "RAW" See: https://developers.google.com/sheets/api/guides/values#writing
    ];
    $range = 'Users!A:E';
    
    $data = [['=ROW()', '=true', $c, $d, $e]];
    
    $body = new Google_Service_Sheets_ValueRange ([
        'values' => $data
    ]);
    
    $gid = '2089252628';
    
    $sql = urlencode("select * where D='{$value}'");
    $url = 'https://docs.google.com/spreadsheets/d/'.$gsheetId.'/gviz/tq?gid='.$gid.'&tqx=out:json&tq='.$sql.'&access_token='.$access_token;
    $res = parseGV(file_get_contents($url));
    
    if(empty($res)) {   // If it is a new endpoint then append new row
        $range = 'Users!A:E';
        $response['insert'] = $service->spreadsheets_values->append($gsheetId, $range, $body, $params);
    }
    else {  // If it exists the endpoint then update the row
        $range = 'Usuarios!A'.$res[0]["Row"].':E'.$res[0]["Row"];
        $response['insert'] = $service->spreadsheets_values->update($gsheetId, $range, $body, $params);
    }
    
    function parseGV($gv) {
        $response = substr($gv, strpos($gv, "\n") + 1);     // Delete first line
        $data = preg_replace('/google.visualization.Query.setResponse\(/', '', $response);
        $data = preg_replace('/\)\;/', '', $data);
        $data = json_decode($data);
        $data_keys = $data->table->cols;
        $data_rows = $data->table->rows;
        $arr = array();
        foreach ($data_rows as $key => $row) {
            $a = array();
            foreach ($row->c as $k => $value) {
                if(isset($value->v)) {
                    $a[$data_keys[$k]->label] = $value->v;  
                }
                else {
                    $a[$data_keys[$k]->label] = null;
                }
            }
            $arr[] = $a;
        }
        return ($arr);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-06
      相关资源
      最近更新 更多