【问题标题】:Get data from a lot of different sheets with a script in Google Spreadsheet使用 Google 电子表格中的脚本从许多不同的工作表中获取数据
【发布时间】:2014-01-17 09:58:50
【问题描述】:

我有一个包含 50 张工作表的电子表格,分别命名为“1”、“2”、“3”。第一张表是摘要,从不同的表中收集特定信息。填写它的简单方法是使用='1'!B5 等等。我想要做的是将该公式输入到脚本中,并让它从新行的所有不同工作表中提取指定的数据。因此,表 1 中的信息位于第 1 行,表 2 中的信息位于第 2 行。

我不想手动执行此操作的原因是我需要将 14 个单元格从 50 个工作表和 2 个电子表格中提取并插入到 4 个不同的概览中,我需要在其中执行此操作。添加多达 5600 个我需要手动更改的函数。

我以这种简单的方式命名工作表的原因是我知道它使我能够编写这种函数。一个变量,每次循环将其值增加 1,并在每个循环的新行上输出函数,例如

var sheetName = 0; output.setValue('='' + sheetName + ''!B5');

我知道我应该有一个用于指定输出单元格的变量,它的值也会在每个循环中增加 1。但是我不知道如何解决这个问题,我的脚本技能只允许我修改其他脚本以使其适合我自己的目的,但我不能自己写任何东西,我一直无法弄清楚这一点而不是背后的理论它。我知道这里不是要求现成代码的地方,所以我不要求甚至不期待解决方案,我只是觉得我必须尝试寻求帮助。

这是一个假人,它显示了我正在尝试做的事情。 https://docs.google.com/spreadsheet/ccc?key=0ArjDeqGD779cdEh2Ynh5ODBFQVFkVE9lX0p4aWpXelE&usp=sharing#gid=0

【问题讨论】:

标签: loops google-apps-script google-sheets


【解决方案1】:

你是一个幸运的人马蒂斯!本周早些时候我自己在做这件事,所以我在你的虚拟表中添加了一个完整的工作脚本。为了完整起见,我将在此处添加一个副本。有任何问题请告诉我:)

function populateOverview() {  

  //set basics
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var viewSheet = ss.getSheetByName('Overview');
  var dataLength = 4; //this is how many cells from each sheet

  //create array of sheet names and remove 'overview' 
  var sheetNames = getSheetNames();
  var overviewIndex = sheetNames.indexOf('Overview');
    sheetNames.splice(overviewIndex, 1);

  //set initial data and target columns  
  var dataColumn = 2;
  var dataRow = 2;
  var targetColumn = 3;

  var j = 0;

  //outer loop iterates through sheets
  for (var i = 0; i < sheetNames.length; i++){

  //inner loop works across the columns in each sheet, and across the column on the overview
    for(var k = 0; k < dataLength; k++){    
  viewSheet.getRange(j+3, targetColumn+k).setValue(ss.getSheetByName(sheetNames[i]).getRange(dataRow, dataColumn).getValue());
      dataColumn = dataColumn + 2;

    }
    //increments row counter for next sheet input
    j = j+1;
    //resets for next sheet
    dataColumn = 2;  
    targetColumn = 3;  
  }

}

/*return sheetnames as array*/
function getSheetNames(){

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheetArray = ss.getSheets();
  var sheetNameArray = [];

  for(var i = 0; i<sheetArray.length; i++){
    sheetNameArray.push(sheetArray[i].getSheetName());
  }

  return sheetNameArray;
}

【讨论】:

  • 我上面给出的解决方案在服务器调用方面非常慢而且非常“昂贵”。我将重写它,以便每个循环将值推送到一个数组,然后将这些数组批量写入工作表。
  • 嗨,Sam,您的脚本运行良好!然而并不是我想要的,我是输入对单元格的引用的循环,而不是拉数据。然后我只需要运行一次脚本即可在概览中输入参考,然后它们会随着数据的变化而更新。我已经开始稍微编辑你的脚本,看看我是否可以解决它,但遇到了一个奇怪的问题,引用在单元格中输入得很好,但我得到一个“#NAME?”错误。如果我将引用复制到另一个单元格,它就可以正常工作。猜猜它与参考函数的工作方式有关,所以我不得不重新考虑。
  • 因此,最终您的脚本将是完美的,我会不时运行它以保持更新概述。谢谢你的帮助山姆!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多