读取和更新同一电子表格中的多个选项卡

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.batchGetspreadsheets.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时,请将它们添加到rangeNamerangePush的数组中。

注:

  • 在此脚本中,请检查 rangeNamerangePush 的值以及您的 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")));
      }
    

参考文献: