簡體   English   中英

在GAS中,通過循環讀取電子表格中多個工作表中的數據列

[英]In GAS, reading col of data in multiple sheets in spreadsheet via loop

我正在嘗試從電子表格中的多個工作表中的GAS(Google Apps腳本)中讀取數據,但無法確定如何執行此操作。

如何設置電子表格的背景

電子表格設置有多個工作表(標簽),每個工作表都有一個唯一的名稱。 我只關心在我的代碼運行時確定的部分工作表,這些工作表的名稱存儲在數組中。 在此示例中,我們假設我關心的3個工作表的名稱存儲在數組中:

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

所有工作表都具有相同的列標題和不同數量的行。 第一列A列包含唯一ID,其余列包含其余數據。

因此,例如,Sheet1看起來像這樣: 在此處輸入圖片說明

我的問題

我的目標:我試圖從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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM