【问题标题】:Google Sheets Script - How to duplicate a sheet based on certain fields in another sheetGoogle Sheets Script - 如何根据另一个工作表中的某些字段复制工作表
【发布时间】:2021-12-11 23:27:39
【问题描述】:

这里是发布问题的新手,也是使用 Google 表格的 Apps 脚本的新手。

我正在尝试让一个宏基于以“~”开头的模板工作表创建一个新工作表。宏应该在另一张表的 A 列中找到以“Y”开头的任何内容。如果它有一个“Y”,它应该获取同一行但列 B 上的供应商名称值。然后这用于创建新工作表并为其命名。

下面的代码执行,但没有任何反应。我能够复制模板表,但在供应商表选项卡中添加搜索似乎导致了问题。任何帮助表示赞赏。我也提前道歉,第一次发帖所以不完全确定这一切都有意义。

    function DuplicateSht() {

var Sect = 0 
var Vend = 0 
var sh = SpreadsheetApp.getActiveSpreadsheet()  
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets(); 
var data = sh.getDataRange().getValues(); //
  for (var i=0 ; i<sheets.length ; i++) {
    SpreadsheetApp.setActiveSheet(sheets[i])
          if (sheets[i].getName().startsWith("Vendor Sheet")){//locates sheet with base information
            Sect = sh.getRange("C2").getValue();//pulls in section number
            Vend = sh.getRange("C3").getValue();//pulls in number of vendors
            for (var j=10 ; j<Vend+10; j++){
              if(data[j][1] == "Y"){//Looks for each vendor with a "Y" in column A.  The number of vendors to review is variable
                var VendName = sh.getRange("B" + j).getValue();//If a vendor has a "Y" will grab their name
                for (var k=0 ; k<sheets.length ; k++) {
                  SpreadsheetApp.setActiveSheet(sheets[k])
                    for (var l=0 ; l<Vend ; l++){
                      if (sheets[l].getName().startsWith("~")){
                        sh.duplicateActiveSheet()//duplicates the sheet beginning with "~"
                        sh.renameActiveSheet("x-" + VendName + " " + Sect)//renames the sheet based on the data from the prep template sheet, including vendor name
                      }
                     }
                 }
                }
              }
            }
    }
}

【问题讨论】:

  • 我注意到您的 data 变量在 ActiveSpreadsheet 上使用了 getDataRange。这将只为您执行脚本时的活动工作表产生数据范围。在更新 SectVend 变量之前,尝试将其移动到您的第一个 if 语句中。这应该会导致您正在评估的工作表的数据范围,并且您应该找到您正在寻找的内容。
  • 谢谢。我更新以包含在这些变量之前的 if 语句中。我现在收到“无法读取未定义的属性 '1'”错误。它与它在 A 列中查找带有“Y”的任何内容的行有关。我还注意到通过调试我的 VendName 变量没有被赋值
  • 您能分享一个指向您的工作表的链接吗?
  • 我可以共享一张工作表。我怎么能在这里做到这一点?我发现其中一个问题是我没有使用“.getActiveSheet()”作为 getRange 来比较“Y”值。

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


【解决方案1】:

我对您的挑战的理解是,您有一个包含不同供应商信息的电子表格。供应商都列在一张纸上。然后,每个供应商,当他们在该列表表的某一列中获得“Y”时,将获得基于模板创建的专用表。

如果这种结构是正确的,那么您可以避免原始代码中的嵌套语句,并更直接地寻找供应商和创建表格。

这是我创建的the spreadsheet,它演示了这一点并显示了以下代码。

function DuplicateSht() {
  //since there is only one Vendor Sheet we can just set a variable pointing to it, then get the data in the sheet using getDataRange
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var ws = ss.getSheetByName("Vendor Sheet")
  var data = ws.getDataRange().getValues()

  //this "reduce function" filters the data so we have an array ("vendors") that only includes those rows with a "Y" in the first column 
  var vendors = data.reduce(function(acc, curr) {   
    if(curr[0] === "Y") {
      acc.push(curr)
    }
    return acc
  },[])

  //now loop through the vendors list and for each one set up the desired sheet name -- before duplicating the template, make sure it doesn't already exist. 
  for (i=0; i<vendors.length; i++){
    var sect = vendors[i][2]
    var name = "x-" + vendors[i][1] + " " + sect

    //get the names of all the sheets
    var sheets = ss.getSheets().map(function (r){return r.getName()})  

    //check to see if the current vendor you are evaluating has already had a sheet created for it. If not, then create a new sheet based on the template
    if (sheets.indexOf(name) === -1){  
      ss.setActiveSheet(ss.getSheetByName("~Template"))
      ss.duplicateActiveSheet()
      ss.renameActiveSheet(name)
    } 
  }
}

【讨论】:

猜你喜欢
  • 2012-10-21
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
相关资源
最近更新 更多