[英]In GAS, reading col of data in multiple sheets in spreadsheet via loop
我正在尝试从电子表格中的多个工作表中的GAS(Google Apps脚本)中读取数据,但无法确定如何执行此操作。
如何设置电子表格的背景
电子表格设置有多个工作表(标签),每个工作表都有一个唯一的名称。 我只关心在我的代码运行时确定的部分工作表,这些工作表的名称存储在数组中。 在此示例中,我们假设我关心的3个工作表的名称存储在数组中:
sheetNames = ["Sheet1", "Sheet3", "Sheet7"]
所有工作表都具有相同的列标题和不同数量的行。 第一列A列包含唯一ID,其余列包含其余数据。
我的问题
我的目标:我试图从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列的数组,等等。
这里最复杂的因素之一是,即使我仅提取一行数据(根据文档 ), getValues()
也会返回二维数组。 我不确定是否可以以某种方式创建3D阵列,即使可以,这是否是最佳解决方案?
在此先感谢您的帮助/想法/想法!
从列中获取值时,最好使用平面数组[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]
一样访问它们。
这是一个示例,说明如何通过3个嵌套循环读取所有工作表中的所有数据,从而在一个对话框中显示所有工作表的内容。
所有图纸的代码
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");
}
带有某些排除的工作表和工作表标题的代码
function displayAllSheets()
{
var exclude=['set','tak','merge'];
var ss=SpreadsheetApp.getActive();
var allshts=ss.getSheets();
var s='<table>';
for(var i=0;i<allshts.length;i++)
{
var sht=allshts[i];
if(exclude.indexOf(sht.getName())<0)
{
var rng=sht.getDataRange();
var valA=rng.getValues();
for(var j=0;j<valA.length;j++)
{
if(j==0){s+='<tr><th><strong>Sheet Name: ' + sht.getName() + '</strong></th></tr>';}
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");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.