在GAS中,通过循环在电子表格中读取多个工作表中的数据列

时间:2017-08-05 15:04:29

标签: javascript arrays google-apps-script google-sheets

我正在尝试从电子表格中的多个工作表中读取GAS(Google Apps脚本)中的数据,并且无法确定如何执行此操作。

关于如何设置电子表格的背景

电子表格设置有多个工作表(标签),每个工作表都有一个唯一的名称。我只关心在我的代码运行时确定的工作表的子集,这些工作表的名称存储在一个数组中。在这个例子中,我们假设我关心的3张纸的名称是在数组中进行的:

sheetNames = ["Sheet1", "Sheet3", "Sheet7"]

所有工作表都具有相同的列标题和不同的行数。第一列(列A)包含唯一ID,其余列包含其余数据。

例如,Sheet1看起来像这样: enter image description here

我的问题

我的目标:我正在尝试从Sheet1,Sheet3和Sheet7中读取A列中的ID列,并存储该数据供以后使用。

这是我到目前为止的代码:

// For this case, assume sheetNames = ["Sheet1", "Sheet3", and "Sheet7"]

for (var i=0; i<sheetNames.length; i++) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetNames[i]);
  var values = sheet.getRange(2, 1, sheet.getLastRow()-1, 1).getValues();
}

到目前为止(当然:)的问题是变量values在循环中每次迭代都被覆盖。但我有点卡住了。

我想做的是像数组数组那样排序,以便values[0]包含一个数组,其中包含来自Sheet1的列A,values[1]包含一个数组,其中包含来自Sheet3的列A,等等。 / p>

这里的一个复杂因素是getValues()返回一个二维数组,即使我只提取一行数据(按documentation)。我不确定我是否能以某种方式创建3D阵列,即使我可以,这是否是最好的解决方案?

提前感谢任何帮助/想法/想法!

2 个答案:

答案 0 :(得分:2)

当您从列中获取值时,最好使用平面数组[1,2,3]而不是[[1], [2], [3]]以便将来进行操作。

可以实现这种平坦化
values.map(function (row) {return row[0]; });

至于存储来自多个工作表的值,为此使用键值对是很自然的。也就是说,values将是一个字典,其中键是表名,而对应的值是来自A列的数据数组。

var sheetNames = ["Sheet1", "Sheet3", and "Sheet7"]
var ss = SpreadsheetApp.getActiveSpreadsheet();
var values = {};
for (var i = 0; i < sheetNames.length; i++) {
  var sheet = ss.getSheetByName(sheetNames[i]);
  values[sheetNames[i]] = sheet.getRange(2, 1, sheet.getLastRow()-1, 1)
                               .getValues()
                               .map(function (row) {
                                  return row[0];
                                });
}

这些可以稍后访问,如values["Sheet1"][3]

答案 1 :(得分:2)

在一个对话框中显示所有工作表

以下是一个示例,说明如何通过3个嵌套循环读取所有工作表中的所有数据,从而在一个对话框中显示所有工作表的内容。

所有表格的代码

TABLE_B

包含部分工作表的代码和工作表标题

function displayAllSheets() 
{
    var ss=SpreadsheetApp.getActive();
    var allshts=ss.getSheets();
    var s='<table>';
    for(var i=0;i<allshts.length;i++)//loop through all sheets
    {
      var sht=allshts[i];
      var rng=sht.getDataRange();//get all data in a sheet
      var valA=rng.getValues();
      for(var j=0;j<valA.length;j++)//loops through rows
      {
        s+='<tr>';
        if(j==0)
        {
          for(var k=0;k<valA[0].length;k++)
          {
            s+='<th>' + valA[j][k] + '</th>';
          } 
       }
       else
       {
          for(var k=0;k<valA[0].length;k++)
          {
            s+='<td>' + valA[j][k] + '</td>';
          }
        }
        s+='</tr>';
      }
    }
    s+='</table>';
    s+='<input type="button" value="Close" onClick="google.script.host.close();" />';
    var output=HtmlService.createHtmlOutput(s).setWidth(1000).setHeight(450);
    SpreadsheetApp.getUi().showModelessDialog(output, "All Sheets");
}