【问题标题】:How can I gather all data from my sheets?我怎样才能从我的工作表中收集所有数据?
【发布时间】:2023-01-27 18:30:24
【问题描述】:

我有一个 Google 电子表格,其中有很多包含数据的表格,每张表格在 1-2 到 40-50 行之间。 我还必须注意,我不是程序员,而是根据 Google 的结果来处理这个问题。

我的目标是拥有一个从所有其他工作表收集数据的“主”表和一个“过滤器”表,我可以在其中根据某些值过滤所有“主”数据。

我已经能够让它“有点”工作,但由于数据量大,脚本大部分时间都会超时,主要问题是,列标题并不总是以相同的顺序排列,我得到的数据是很难过滤和处理。

到目前为止,这是有效的:

const URL_LIST_SHEET_NAME = "URL_LIST!"; 
const FILTER_SHEET = "Filter";
const MASTER_NAME = "Master";
const TEMPLATE_NAME = "Template";

function GET_DATA() {
  const dataSheets = SpreadsheetApp.getActiveSpreadsheet()
      .getSheets()

for (let s in dataSheets) {
    let sheetNm = dataSheets[s].getName();
    // Should skip sheets that I don't need, to reduce the time but not really working ???
    if (sheetNm === FILTER_SHEET || sheetNm === URL_LIST_SHEET_NAME || sheetNm === MASTER_NAME || sheetNm === TEMPLATE_NAME) { continue; }
  const ranges = dataSheets
      .map(info => info.getRange("A2:F30")); //if I put info.getDataRange() here it doesn't work
return ranges
      .reduce((result, range) => result.concat(range.getValues()), []); 
  }
}

我一直在尝试做的是通过组合我发现的不同解决方案,根据标题行对数据进行排序。 到目前为止它没有工作,即使我让它成功执行,“主”表中也没有任何内容。我得到的最常见错误是“TypeError: sheets.getDataRange is not a function”

const URL_LIST_SHEET = "URL_LIST!";
const FILTER_SHEET = "Filter";
const MASTER_NAME_SHEET = "Master";
const TEMPLATE_NAME_SHEET = "Template";
const target_headers = ['firstName', 'companyName', 'BadLinkURL', 'DiscreditProofURL', 'email', 'Niche']; 
// Headers I need to sort by, they are not always in the same collums and I need them to be for exporting

function GetColumnValues() {
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();

  for (var i=0; i<sheets.length; i++) {

  for (let s in sheets) {
    // Gets sheet name.
    let sheetNm = sheets[s].getName();
    // Skips sheets.
    if (sheetNm === FILTER_SHEET || sheetNm === URL_LIST_SHEET || sheetNm === MASTER_NAME_SHEET || sheetNm === TEMPLATE_NAME_SHEET)
     { continue; }
  
    const range = sheets[i].getDataRange(); //With varying data ranges, triming the completely blank rows is a must
    const values = range.getValues();
    const headers = values.shift();
    const columnIndex = headers.indexOf(target_headers);
    const columnValues = values.map(row => row[columnIndex]);
    return columnValues;
  }
  }
}

考虑到我正在超时,我可以分批处理 ~30 张,直到全部处理完吗?此工作簿中的工作表数量超过 100 张,而且只会增加,所以我认为这将是执行时间的一个严重问题。

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    我在你的 GET_DATA 函数中看到的第一个问题是你在一个循环中有一个嵌套的循环......而且它是同一个循环(遍历所有工作表)。所以你应该只做一次。

    最好尝试类似的东西

    const excluded = [
      FILTER_SHEET,
      URL_LIST_SHEET_NAME,
      MASTER_NAME,
      TEMPLATE_NAME
    ]
    const RANGE = "A2:F30"
    
    function GET_DATA() {
      const dataSheets = SpreadsheetApp.getActiveSpreadsheet().getSheets()
      const values = dataSheets
          .filter(dataSheet => excluded.indexOf(dataSheet.getName()) === -1)
          .map(info => info.getRange(RANGE))
          .reduce((result, range) => result.concat(range.getValues()), []); 
    
      return values
    }
    

    【讨论】:

      猜你喜欢
      • 2012-02-10
      • 1970-01-01
      • 2017-04-06
      • 2018-08-04
      • 2018-01-21
      • 2023-01-28
      • 2023-03-22
      • 1970-01-01
      • 2021-01-22
      相关资源
      最近更新 更多