【问题标题】:Google Sheets combine several sheets into one sheet with script谷歌表格将多张表格与脚本合并为一张表格
【发布时间】:2020-08-27 18:03:16
【问题描述】:

我需要用脚本将几张纸合并成一张纸。此外,在组合工作表时,我需要通过将它们的名称检查到两列来将它们分开。例如,包含单词“cat”的工作表应位于左列,包含单词“dog”的工作表应位于右列。目前,我有一个脚本,可以将具有特定单词的所有工作表过滤到一个数组中。我是 Google 表格的新手,我们将不胜感激。

这是我当前的脚本:

function myFunction() 
 {
 var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var newSheet = activeSpreadsheet.getSheetByName("AllSheets");

if (newSheet != null) {
    activeSpreadsheet.deleteSheet(newSheet);
}

newSheet = activeSpreadsheet.insertSheet();
newSheet.setName("AllSheets");
   const ss = SpreadsheetApp.getActiveSpreadsheet();
   const allSheets = ss.getSheets();
   const allSheets_names=allSheets.map(sheet=>sheet.getSheetName())  

   const neededSheets= ["Cat", "Dog"];
   
   const filteredListOfSheetsNames = []   
   neededSheets.forEach(ns =>allSheets_names.forEach( (as,index) =>
       {if (as.indexOf(ns)>-1){filteredListOfSheetsNames.push(as)}}))                   
       const filteredListOfSheets =  filteredListOfSheetsNames.map(name =>ss.getSheetByName(name))  
           
}

【问题讨论】:

  • 我必须为我糟糕的英语水平道歉。不幸的是,从你的问题来看,我无法理解你目前的情况和目标。那么为了正确理解它们,您能否提供您期望的示例输入和输出?另外,你能提供你当前的脚本吗?如果你能做到,你能把它们添加到你的问题中吗?借此,我想尝试理解它们。
  • @Tanaike 让我为没有更好地解释而道歉。我已经编辑了我的问题。
  • 那么您的工作表是否只包含一列?您介意提供一张您工作表中数据的屏幕截图吗?以及您希望它在合并的表单中喜欢什么?
  • @ziganotschka 我在右侧添加了一个屏幕截图。左侧是一张猫。
  • 我只能在屏幕截图中看到一张纸。您的所有工作表是否包含相同(最大)数量的列(例如 4),所以在最后一张工作表中,来自猫床单的信息应在 A 到 D 列中,而来自狗床单的信息应在 E 到 H 列中?您需要在最后一页中指定“dog”的起始列以避免覆盖。

标签: google-apps-script google-sheets


【解决方案1】:

最好是创建两个数组 - 用于汇总表的两个不同范围

  • 将“猫床单”附加到另一个,将“狗床单”附加到另一个
  • 由于您已经找到并正确排序了您感兴趣的工作表,因此您可以在内部循环中定义一个辅助数组(每种类型的工作表都有一个单独的数组),您可以将来自一种类型的所有工作表的数据附加到该数组中李>
  • 将此数组设置为目标工作表的所需范围(边)
  • 了解原始表格的(最大)尺寸以正确划分目标表格的最左/右侧非常重要。

示例:

function myFunction() 
{
  var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var newSheet = activeSpreadsheet.getSheetByName("AllSheets");  
  if (newSheet != null) {
    activeSpreadsheet.deleteSheet(newSheet);
  }  
  newSheet = activeSpreadsheet.insertSheet();
  newSheet.setName("AllSheets");
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const allSheets = ss.getSheets();
  const allSheets_names=allSheets.map(sheet=>sheet.getSheetName())    
  const neededSheets= ["Cat", "Dog"];  
  const filteredListOfSheetsNames = [];       
  neededSheets.forEach(function(ns){  
    var i = neededSheets.indexOf(ns);
    filteredListOfSheetsNames[i]=[];
    allSheets_names.forEach( (as,index) => {                            
      if (as.indexOf(ns)>-1){
        filteredListOfSheetsNames[i].push(as);
        }
      }
    )
    const filteredListOfSheets  =  filteredListOfSheetsNames[i].map(name =>ss.getSheetByName(name));  
    var array = [];
    filteredListOfSheets.forEach(function(sheet){var values = sheet.getRange(1,1,sheet.getLastRow(),13).getValues(); array.push(values);});
    array = [].concat.apply([],array);
    if(array.length > 0){
      newSheet.getRange(1,i*13+1, array.length, array[0].length).setValues(array);
      }
    }
  )
}

【讨论】:

  • 感谢您的回答!不幸的是,我收到 TypeError: Cannot read property 'length' of undefined(第 34 行,文件“代码”)。这是 newSheet.getRange(1,i*13+1, array.length, array[0].length).setValues(array); 的行。我不确定如何解决这个问题。
  • 您确定每种类型至少有一张纸(注意区分大小写)并且至少其中一张不为空)?如果没有,您应该执行一个 `if 语句来解决这些情况,我会更新我的答案。在代码中实现一些日志以查看是否正确找到了工作表和数据。
  • 很抱歉我错过了输入所需的表格,一切正常!非常感谢你!另外,请问如何保持床单的样式?例如颜色、字体?最后,如何在工作表之间制作空行,以便更具可读性?再次感谢您!
  • 要插入一个空行,您可以在array.push(values);之后实现请求array.push([[ ]])要保留样式,您需要以不同的方式继续并使用方法CopyTo()而不是setValues()。这会使工作流程有所不同,因此我建议您将其作为一个新问题提出 - 首先尝试自己实现它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
  • 2021-10-03
  • 2016-09-08
  • 1970-01-01
  • 2015-07-25
相关资源
最近更新 更多