读取和更新同一电子表格中的多个选项卡
Reading and updating multiple tabs in the same spreadsheet
我有一个 Google Spreadsheet,我在其中使用 Google Analytics 插件检索数据。在一个选项卡中,我合并了所有数据并将此特定选项卡用于我的 Google Datastudio 报告。在这里,我分析了我的 Google 广告活动数据 - 成本和转化。
这个 Spreadsheet 有多个标签(每个标签包含一个特定的转换)我需要能够读取和写入多个标签。它必须读取 Google Analytics 数据并将此数据写入另一个 sheet。
我最初创建此脚本是为了从 1 个选项卡读取并写入 1 个选项卡,它正在运行。然后我注意到我需要对几乎所有选项卡执行此操作。
这是我当前的脚本:
function readAndWrite() {
var spreadsheetId = 'xxx';
var counter = 0;
var rangeName = ['readingTab1!A16:C','readingTab2!A16:C','readingTab3!A16:C','readingTab4!A16:C','readingTab5!A16:C'];
var rangePush = ['writingTab1','writingTab2','writingTab3','writingTab4','writingTab5','writingTab5'];
var values = Sheets.Spreadsheets.Values.get(spreadsheetId, rangeName[counter]).values;
var data = [];
if (!values) {
Logger.log('No data found.');
} else {
Logger.log('Starting script.');
Logger.log('There are ' + values.length + ' unique rows.');
Logger.log(values[0][2]);
while (counter < 5){
data.length = 0;
for (var row = 0; row < values.length; row++) {
var campaign = values[row][0];
var date = values[row][1];
var cost = values[row][2];
data.push({range: rangePush[counter], values: [[date, campaign, cost]]});
}
counter++;
Sheets.Spreadsheets.Values.batchUpdate({data: data, valueInputOption: "USER_ENTERED"},spreadsheetId);
}
}
Logger.log('Finished.');
}
在 rangeName 中,我创建了一个数组,其中包含应从中读取的选项卡的名称和范围。
在 rangePush 中,我创建了一个数组,其中包含应将数据推送到的名称。
当我 运行 脚本时,我收到以下错误:
GoogleJsonResponseException:API 调用 sheets.spreadsheets.values.batchUpdate 失败,错误:无效数据[1886]:无法解析范围:writingTab2。
有没有人能看出问题所在并能帮我解决这个问题?
我希望我的解释很清楚,如果不明白请告诉我。
谢谢!
我相信你的目标如下。
- 您想要使用表格 API 和 Google Apps 脚本将值从
readingTab#!A16:C
sheet 复制到 writingTab#
sheet。
- 那些sheet个名字被放入数组中,两者的每个索引对应于复制和粘贴sheets。
如果我的理解是正确的,下面的修改怎么样?
首先,关于你的错误,当我看到你的样本Spreadsheet时,有3个读写sheet的'readingTab1!A16:C', 'readingTab2!A16:C', 'readingTab3!A16:C'
和'writingTab1', 'writingTab2', 'writingTab3'
。但是您的脚本使用 while (counter < 5){
。这样,counter
大于 4 后,范围变为 undefined
。我认为这可能是您问题的原因。
为了通过解决此问题来实现您的目标,修改以下脚本怎么样?
修改后的脚本:
当使用spreadsheets.values.batchGet
和spreadsheets.values.batchUpdate
方法时,脚本变成如下简单脚本。
function readAndWrite() {
var spreadsheetId = 'xxx';
var rangeName = ['readingTab1!A16:C', 'readingTab2!A16:C', 'readingTab3!A16:C'];
var rangePush = ['writingTab1', 'writingTab2', 'writingTab3'];
var values = Sheets.Spreadsheets.Values.batchGet(spreadsheetId, {ranges: rangeName}).valueRanges;
values.forEach((v, i) => v.range = rangePush[i]);
Sheets.Spreadsheets.Values.batchUpdate({ data: values, valueInputOption: "USER_ENTERED" }, spreadsheetId);
}
- 在这个修改后的脚本中,假设有
'readingTab1!A16:C', 'readingTab2!A16:C', 'readingTab3!A16:C'
和'writingTab1', 'writingTab2', 'writingTab3'
三个读写sheet。当你添加更多的sheet时,请将它们添加到rangeName
和rangePush
的数组中。
注:
在此脚本中,请检查 rangeName
和 rangePush
的值以及您的 Spreadsheet 名称sheet 再次.
此脚本使用表格 API。因此,请在高级 Google 服务中启用表格 API。
我觉得在你的情况下,用Spreadsheet服务代替SheetsAPI也可以达到你的目的。但是我认为使用Sheets API 的过程成本会更低。但是,如果您想在不使用表格的情况下实现您的目标 API,您还可以使用以下脚本。
function readAndWrite2() {
var spreadsheetId = 'xxx';
var rangeName = ['readingTab1!A16:C', 'readingTab2!A16:C', 'readingTab3!A16:C'];
var rangePush = ['writingTab1', 'writingTab2', 'writingTab3'];
var ss = SpreadsheetApp.openById(spreadsheetId);
rangeName.forEach((r, i) => ss.getRange(r).copyTo(ss.getSheetByName(rangePush[i]).getRange("A1")));
}
参考文献:
我有一个 Google Spreadsheet,我在其中使用 Google Analytics 插件检索数据。在一个选项卡中,我合并了所有数据并将此特定选项卡用于我的 Google Datastudio 报告。在这里,我分析了我的 Google 广告活动数据 - 成本和转化。
这个 Spreadsheet 有多个标签(每个标签包含一个特定的转换)我需要能够读取和写入多个标签。它必须读取 Google Analytics 数据并将此数据写入另一个 sheet。 我最初创建此脚本是为了从 1 个选项卡读取并写入 1 个选项卡,它正在运行。然后我注意到我需要对几乎所有选项卡执行此操作。
这是我当前的脚本:
function readAndWrite() {
var spreadsheetId = 'xxx';
var counter = 0;
var rangeName = ['readingTab1!A16:C','readingTab2!A16:C','readingTab3!A16:C','readingTab4!A16:C','readingTab5!A16:C'];
var rangePush = ['writingTab1','writingTab2','writingTab3','writingTab4','writingTab5','writingTab5'];
var values = Sheets.Spreadsheets.Values.get(spreadsheetId, rangeName[counter]).values;
var data = [];
if (!values) {
Logger.log('No data found.');
} else {
Logger.log('Starting script.');
Logger.log('There are ' + values.length + ' unique rows.');
Logger.log(values[0][2]);
while (counter < 5){
data.length = 0;
for (var row = 0; row < values.length; row++) {
var campaign = values[row][0];
var date = values[row][1];
var cost = values[row][2];
data.push({range: rangePush[counter], values: [[date, campaign, cost]]});
}
counter++;
Sheets.Spreadsheets.Values.batchUpdate({data: data, valueInputOption: "USER_ENTERED"},spreadsheetId);
}
}
Logger.log('Finished.');
}
在 rangeName 中,我创建了一个数组,其中包含应从中读取的选项卡的名称和范围。 在 rangePush 中,我创建了一个数组,其中包含应将数据推送到的名称。
当我 运行 脚本时,我收到以下错误:
GoogleJsonResponseException:API 调用 sheets.spreadsheets.values.batchUpdate 失败,错误:无效数据[1886]:无法解析范围:writingTab2。
有没有人能看出问题所在并能帮我解决这个问题? 我希望我的解释很清楚,如果不明白请告诉我。
谢谢!
我相信你的目标如下。
- 您想要使用表格 API 和 Google Apps 脚本将值从
readingTab#!A16:C
sheet 复制到writingTab#
sheet。- 那些sheet个名字被放入数组中,两者的每个索引对应于复制和粘贴sheets。
如果我的理解是正确的,下面的修改怎么样?
首先,关于你的错误,当我看到你的样本Spreadsheet时,有3个读写sheet的'readingTab1!A16:C', 'readingTab2!A16:C', 'readingTab3!A16:C'
和'writingTab1', 'writingTab2', 'writingTab3'
。但是您的脚本使用 while (counter < 5){
。这样,counter
大于 4 后,范围变为 undefined
。我认为这可能是您问题的原因。
为了通过解决此问题来实现您的目标,修改以下脚本怎么样?
修改后的脚本:
当使用spreadsheets.values.batchGet
和spreadsheets.values.batchUpdate
方法时,脚本变成如下简单脚本。
function readAndWrite() {
var spreadsheetId = 'xxx';
var rangeName = ['readingTab1!A16:C', 'readingTab2!A16:C', 'readingTab3!A16:C'];
var rangePush = ['writingTab1', 'writingTab2', 'writingTab3'];
var values = Sheets.Spreadsheets.Values.batchGet(spreadsheetId, {ranges: rangeName}).valueRanges;
values.forEach((v, i) => v.range = rangePush[i]);
Sheets.Spreadsheets.Values.batchUpdate({ data: values, valueInputOption: "USER_ENTERED" }, spreadsheetId);
}
- 在这个修改后的脚本中,假设有
'readingTab1!A16:C', 'readingTab2!A16:C', 'readingTab3!A16:C'
和'writingTab1', 'writingTab2', 'writingTab3'
三个读写sheet。当你添加更多的sheet时,请将它们添加到rangeName
和rangePush
的数组中。
注:
在此脚本中,请检查
rangeName
和rangePush
的值以及您的 Spreadsheet 名称sheet 再次.此脚本使用表格 API。因此,请在高级 Google 服务中启用表格 API。
我觉得在你的情况下,用Spreadsheet服务代替SheetsAPI也可以达到你的目的。但是我认为使用Sheets API 的过程成本会更低。但是,如果您想在不使用表格的情况下实现您的目标 API,您还可以使用以下脚本。
function readAndWrite2() { var spreadsheetId = 'xxx'; var rangeName = ['readingTab1!A16:C', 'readingTab2!A16:C', 'readingTab3!A16:C']; var rangePush = ['writingTab1', 'writingTab2', 'writingTab3']; var ss = SpreadsheetApp.openById(spreadsheetId); rangeName.forEach((r, i) => ss.getRange(r).copyTo(ss.getSheetByName(rangePush[i]).getRange("A1"))); }