我正在使用Google Script和电子表格,但似乎无法获得所需内容。
到目前为止,我正在从API检索数据,并将其附加到列表的末尾。然而,现在我正在进行优化,只添加新的数据。
我是这样的:
- 检测需要添加的新行数
- 在开头添加新数据
我通过在文档开头添加新行(只要我有新元素就行(并用获得的数据更新这些新行来实现这一点。然而,我无法完成最后一部分。
我找不到Google Sheets API v4与Google Script的正确语法示例,很难看出哪里出错了。
现在我有以下内容:
insertRowsInSheet(sheet.cases.id, newDocuments.length, data);
其中:
sheet.cases.id
:这是电子表格的idnewDocuments.length
:这是我需要添加的新行数data
:这是一个具有新字段的数组
该方法调用一个执行以下操作的函数:
function insertRowsInSheet(sheetId, size, data) {
try {
const response = Sheets.Spreadsheets.batchUpdate({
"requests": [
{
"insertDimension": {
"range": {
"sheetId": sheetId,
"dimension": "ROWS",
"startIndex": 1,
"endIndex": size+1
},
"inheritFromBefore": false,
}
},
{
"updateCells": {
rows: {
values: [
["test", "test"],
["test2", "test2"]]
},
fields: "*",
range: {
sheetId: sheetId,
startRowIndex: 1,
startColumnIndex: 1,
}
}
}
]}, sheet.id);
Logger.log(response);
} catch (error) {
Logger.log(`error: ${error}`);
}
}
由于batchUpdate
只有在两种方法都有效的情况下才有效,我现在得到以下错误:
error: GoogleJsonResponseException: API call to sheets.spreadsheets.batchUpdate failed with error: Invalid value at 'requests[1].update_cells.rows.values[0]' (type.googleapis.com/google.apps.sheets.v4.CellData), "test"
我知道第一部分是有效的,因为如果我只运行第一个requests
,它会输入与我有新元素一样多的行。所以我从
A | B | |
---|---|---|
1 | 测试1 | 测试1|
2 | 测试2 | 测试2 |
在您的脚本中,我认为需要修改请求体的updateCells
。
修改的脚本:
spreadsheetId = "###"; // Please set Spreadsheet ID.
sheetId = "###"; // Please set Sheet ID.
data = [["test", "test"], ["test2", "test2"]]; // This is from your showing script.
const response = Sheets.Spreadsheets.batchUpdate({
requests: [
{
insertDimension: {
range: { sheetId: sheetId, startIndex: 1, endIndex: 1 + data.length, dimension: "ROWS" }
}
},
{
updateCells: {
range: { sheetId: sheetId, startRowIndex: 1, endRowIndex: 1 + data.length },
rows: data.map(e => ({ values: e.map(f => ({ userEnteredValue: (isNaN(f) || f == "" ? { stringValue: f } : { numberValue: f }) })) })),
fields: "userEnteredValue"
}
}
]
}, spreadsheetId);
或者,当使用电子表格服务(SpreadsheetApp(时,示例脚本如下。
const data = [["test", "test"], ["test2", "test2"]]; // This is from your showing script.
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); // Please set sheet name.
const length = data.length;
sheet.insertRowsAfter(1, length).getRange(2, 1, length, data[0].length).setValues(data);
- 在上述两个脚本中,
data
长度的行从第2行插入,data
的值放入插入的行中
参考文献:
- 方法:spreadsheets.batchUpdate
- 更新单元格请求
- insertRowsAfter(afterPosition,howMany(