【问题标题】:Split One Google Sheet into Multiple Sheets based on Column Value - Replace Duplicate Sheets根据列值将一个 Google 工作表拆分为多个工作表 - 替换重复的工作表
【发布时间】:2023-02-11 03:35:33
【问题描述】:

这超出了我的知识水平,我希望得到帮助。下面的脚本有一些限制。此脚本检查区域选项卡是否存在,如果不存在,源工作表中的区域数据将复制到该区域名称的新选项卡。区域是源工作表的第 24 列,数据从第 3 行开始,标题是第 2 行。

如果区域选项卡已经存在,我希望它被删除重新创建或用当前数据重新填充而不是被跳过。

function createSheets(){

const ss = SpreadsheetApp.getActiveSpreadsheet()
const sourceWS = ss.getSheetByName("Forecast (SQL) Validation")

const regions = sourceWS
  .getRange(3,24,sourceWS.getLastRow()-2,1)
  .getValues()
  .map(rng => rng[0])

const uniqueRegion = [ ...new Set(regions) ]

const currentSheetNames = ss.getSheets().map(s => s.getName())

let ws

uniqueRegion.forEach(region => {

  if(!currentSheetNames.includes(region)){

    ws = null
    ws = ss.insertSheet()
    ws.setName(region)
    ws.getRange("A2").setFormula(`=FILTER('Forecast (SQL) Validation'!A3:CR,'Forecast (SQL) Validation'!X3:X="${region}")`)
    sourceWS.getRange("A2:CR2").copyTo(ws.getRange("A1:CR1"))

}//If regions doesn't exist

})//forEach loop through the list of region

} //close createsheets functions

【问题讨论】:

  • 这个问题需要更多关注:1)每个帖子只有一个“改进”(问题)2)“我希望将其删除重新创建或重新填充”-->选择一个。
  • recreated or repopulated with current data 那些还不存在的选项卡是怎么回事,对吧?因此,对于已经存在的选项卡,将以相同的方式完成,只是应该删除或修改较旧的选项卡。那是对的吗?

标签: javascript google-apps-script google-sheets


【解决方案1】:

试试这个方法

function createSheets() {
  const ss = SpreadsheetApp.getActive()
  const ssh = ss.getSheetByName("Forecast (SQL) Validation");
  const regions = ssh.getRange(3, 24, ssh.getLastRow() - 2, 1).getValues().flat();
  const urA = [...new Set(regions)];
  const shnames = ss.getSheets().map(s => s.getName())
  let ws;
  urA.forEach(region => {
    let idx = shnames.indexOf(region);
    if (~idx) {
      ss.deleteSheet(ss.getSheetByName(shnames(idx)));//if it does exist delete it and create a new one
    }//if it does not exist the just create a new one
    ws = null;
    ws = ss.insertSheet(region);
    ws.getRange("A2").setFormula(`=FILTER('Forecast (SQL) Validation'!A3:CR,'Forecast (SQL) Validation'!X3:X="${region}")`)
    ssh.getRange("A2:CR2").copyTo(ws.getRange("A1:CR1"))
  })
}

解释:

遍历所有选项卡,如果选项卡已经存在,请通过deleteSheet 删除它,然后再次创建它,就像处理不存在的选项卡一样。

【讨论】:

    【解决方案2】:

    我在 Apps 脚本中使用了这些代码。我能够拆分 100 行的示例表。但是,处理8000行真实数据需要很长时间。做了部分除法后,报错“Exceeded maximum execution time”。它无法在 Apps 脚本的处理时间内拆分我的表。我们如何解决这个问题。能否改进代码使其运行得更快?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      • 2015-05-13
      • 1970-01-01
      相关资源
      最近更新 更多