Google 工作表,来自多个工作簿的堆栈报告

Google Sheets, stack report from multiple workbooks

目标:将来自 90 多个 google 工作簿的数据,全部具有相同的 sheet 名称,堆叠到一个主 sheet 中用于报告

信息: 所有作品sheet 都有相同的列数。 我有以下脚本,但它没有 运行 正确,我认为问题在于我如何在粘贴到输出 sheet.

之前缓存/将数据推送到数组

我正在尝试构建一个数组然后一次性粘贴它。

我堆叠的表格有 47 列,行数未知。 打开 sheets 的部分工作正常。

    // Get the data from the worksheets
    var indexsheet = SpreadsheetApp.getActive().getSheetByName("Index");
    var outputsheet = SpreadsheetApp.getActive().getSheetByName("Output");
    var response = SpreadsheetApp.getUi().prompt('Current Cycle', 'Enter Cycle Name Exactly in YY-MMM-Cycle# format', SpreadsheetApp.getUi().ButtonSet.OK_CANCEL)
    var CurrentCycleName = response.getResponseText()

    // Assign datasets to variables
    var indexdata = indexsheet.getDataRange().getValues();


    // For each workbook in the index sheet, open it and copy the data to a cache

    indexdata.forEach(function(row, r) {
            try {

                //open Entity specific workbook
                var workbookid = indexsheet.getRange(r + 1, 7, 1, 1).getValues();
                var Entityworkbook = SpreadsheetApp.openById(workbookid)

                // Open workhseet
                Entitysheet.getSheetByName(CurrentCycleName)

                // Add PR Data to cache - stacking for all countrys
                var PRDataCache = Entitysheet.getDataRange().push()




            } catch {}
  })
    // Set the all values of the sheet at once
        outputsheet.getRange(r + 1, 14).setValue('Issue Splitting Data') 
    Entitysheet.getRange(2, 1, PRDataCache.length || 1, 47).setValues(PRDataCache)

    };

这是我们从中获取工作簿 ID 以打开每个文件的索引选项卡

这是输出文件,我们正在堆叠每个国家/地区的所有数据

我相信你的目标如下。

  • 您想从“索引”的“G”列中检索 Spreadsheet ID sheet。
  • 您想使用对话框给出特定的 sheet 名称。
  • 您想从所有 Spreadsheet 中的规范 sheet 中检索所有值。在这种情况下,您要删除 header 行。
  • 您想将检索到的值放在“输出”上 sheet。

在这种情况下,下面的示例脚本怎么样?

示例脚本:

function myFunction() {
  var ss = SpreadsheetApp.getActive();
  var indexsheet = ss.getSheetByName("Index");
  var outputsheet = ss.getSheetByName("Output");
  var response = SpreadsheetApp.getUi().prompt('Current Cycle', 'Enter Cycle Name Exactly in YY-MMM-Cycle# format', SpreadsheetApp.getUi().ButtonSet.OK_CANCEL);
  var CurrentCycleName = response.getResponseText();

  var ids = indexsheet.getRange("G1:G" + indexsheet.getLastRow()).getValues();
  var values = ids.reduce((ar, [id]) => {
    try {
      var [, ...values] = SpreadsheetApp.openById(id).getSheetByName(CurrentCycleName).getDataRange().getValues();
      ar = [...ar, ...values];
    } catch (e) {
      console.log(`"${id}" was not found.`);
    }
    return ar;
  }, []);
  if (values.length == 0) return;
  
  // If the number of columns is different in all Spreadsheets, please use the following script.
  // var maxLen = Math.max(...values.map(r => r.length));
  // values = values.map(r => r.length < maxLen ? [...r, ...Array(maxLen - r.length).fill("")] : r);

  outputsheet.getRange(outputsheet.getLastRow() + 1, 1, values.length, values[1].length).setValues(values);
}

注:

  • 当Spreadsheet ID数量较多时,处理时间可能超过6分钟。我很担心这个。到时候把Spreadsheet ID分开怎么样?

参考: