在数百个Google Spreadsheets中总结相同的单元格

时间:2013-04-02 08:40:58

标签: google-apps-script google-sheets

我的谷歌硬盘中有数百个报告。每个报告都是自己的文件(电子表格,有一张)。

我需要所有这些电子表格中的单元格B10。如果有一个带有两个参数的函数会很棒:

  1. 包含电子表格文件的目录的名称
  2. 您想要的特定单元格。
  3. 我尝试做脚本

    function Suma(cell)
    {
      var files = DocsList.getFilesByType('spreadsheet', 0, 100);
      for (var i = 0; i < files.length; i++)
      {
       var sheets = SpreadsheetApp.open(files[i]).getSheets();
       var sum = 0;
       for (var i = 0; i < sheets.length ; i++ )
       {
         var sheet = sheets[i];
         var val = sheet.getRange(cell).getValue();
    
            if (typeof(val) == 'number') 
            {
                sum += val;   
            }
       }
      }
      return sum;
    }
    

    当然需要一些帮助:) THX

2 个答案:

答案 0 :(得分:0)

你正在做什么是好的但是你可能想要列出文件夹而不是整个驱动器上的文件.. 如果你有太多的ss并且脚本将耗尽时间也会失败。要解决这个问题是可能的,但需要更复杂的代码。最好使用jsapi或appengine在客户端进行。

答案 1 :(得分:0)

由于打开每个电子表格所需的时间,这将是缓慢的,并且存在超时的风险。

此版本的功能将采用文件夹名称和目标单元格,并从该文件夹中的所有电子表格中生成该位置的数值之和。

DriveApp依赖于迭代器,而不是文件夹和文件集合的数组,因此您有两个使用.hasNext().next()的示例访问集合中的对象。

function Suma(folderName, cell)
{
  var folders = DriveApp.getFolders();
  var folderFound = false;
  var folder;
  while (folders.hasNext() && !folderFound) {
    folder = folders.next();
    folderFound = folder.getName() == folderName;
  }
  if (!folderFound) throw "No folder named " + folderName;  // Error

  var sheets = folder.getFilesByType(MimeType.GOOGLE_SHEETS);
  var sum = 0;
  while (sheets.hasNext()) {
    var sheet = SpreadsheetApp.openById(sheets.next().getId());
    var val = sheet.getActiveSheet().getRange(cell).getValue();
    if (typeof(val) == 'number') {
      sum += val;   
    }
  }
  return sum;
}