使用Google Spreadsheet中的脚本从许多不同的工作表中获取数据

时间:2014-01-17 09:58:51

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

我有一张包含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

1 个答案:

答案 0 :(得分:0)

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

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