谷歌表格API V4:更新ID等于某个值的行。

3

我在每一行的A(ID)列中都有一个ID。现在,我想更新一行,其中列A中的ID等于我的代码中的ID。
在旧版v3版本(+包装器),我可以使用以下代码轻松搜索该行并“row.save()”:

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

但我找不到类似于v4的东西。我发现唯一的一个是这个2017年的答案,提供了一种解决方法,但那意味着我需要编写单元格,读取该单元格的值,删除该单元格,然后使用来自该单元格的值读取我实际想要的行,并使用更新的数据覆盖该行。

目前有更简单的方法吗?


1
谢谢您的回复。不幸的是,即使使用Sheets API v4,也不能通过一个API调用来进行值的搜索和放置。至少需要2个API调用来检索和放置值。对于这种情况,我感到非常抱歉。 - Tanaike
1
感谢您的快速回复。对于您的情况,以下是一个流程:1.使用spreadsheets.values.get和spreadsheets.values.batchGet检索值。这里使用了一个API。2.使用脚本从检索到的值中检索所需的值和索引。3.使用spreadsheets.values.update和spreadsheets.values.batchUpdate将值作为更新放置。这里使用了一个API。您可以使用Node.js的googleapis的Sheets API。通过这种方式,我认为您的目标可以实现。如果您需要示例脚本,请随时告诉我们。 - Tanaike
所以您的意思是我读取所有行并通过脚本进行筛选。然后只更新已更新的行?感谢您的帮助。 - TakeAMinute
1
我认为你的回复是正确的。 - Tanaike
1
我认为这个脚本很好。我很高兴你的问题得到了解决。因此,我想点赞它。如果您的问题已经解决,请接受它。这将对其他遇到相同问题的用户有所帮助。 - Tanaike
显示剩余7条评论
2个回答

2

我目前有这个解决方案。

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

最初的回答

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

另一种方法是使用元数据来识别正确的行。https://developers.google.com/sheets/api/guides/metadata - hakunin

1
我的技巧是创建一个带有行号的列。这样,每次添加新行时,您必须向该单元格添加值'=row'。
其次,我使用谷歌可视化查询来检查条件(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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接