【问题标题】:Google apps script: loop over tabs to save to separate worksheets谷歌应用程序脚本:循环选项卡以保存到单独的工作表
【发布时间】:2014-10-21 03:17:00
【问题描述】:

我想遍历某个工作表的所有单独选项卡(最好跳过需要排除的数组选项卡)。对于每个单独的选项卡,我想将其保存为 Google 驱动器中的单独工作表,并将选项卡的标题作为文件名。如果文件名已存在,则应将其覆盖。

最好我希望能够在所需的脚本中排除一组工作表(例如,名为“master”和“test”)。

很遗憾,我对 Google Apps 脚本的了解不足以自己编写它。任何工作示例都受到高度赞赏。

编辑:这是我解决它的方法(总是欢迎提出改进建议!:-)) EDIT2:更改了 deleteSheet 行

function copySheetsToSS() {
  var ss = SpreadsheetApp.getActive();
  for(var n in ss.getSheets()){// loop over all tabs in the spreadsheet
    var sheet = ss.getSheets()[n];// look at every sheet in spreadsheet
    var name = sheet.getName();//get name
    if(name != 'master' && name != 'test'){ // exclude some names
      var alreadyExist = DriveApp.getFilesByName(name);// check if already there
      while(alreadyExist.hasNext()){
        alreadyExist.next().setTrashed(true);// delete all files with this name
      }
      var copy = SpreadsheetApp.create(name);// create the copy
      sheet.copyTo(copy).setName(name); // rename copied sheet to same name as SS
      copy.deleteSheet(copy.getSheets()[0]);// delete default Sheet1 from new copy
    }
  }
}

【问题讨论】:

  • 2 cmets 关于您刚刚添加的代码的最后一部分(不提及第一部分的来源):如果您的来源有一个名为 Sheet1 的工作表,sheet.copyTo(copy).setName(name) 将失败(错误 =sheet此名称已存在)和 2:deleteActiveSheet()[0] 不是有效方法,[0] 参数不存在且无效...此方法删除活动工作表(默认为 sheet[0] 在新创建的工作表)。总而言之,我建议您使用下面我的(编辑过的)版本,它更安全且适用于各种情况。
  • 好的,但是如果源电子表格有一个名为 sheet1 的工作表,仍然会出现问题。
  • 是的,我愿意冒着风险,来源不会有一张名为 Sheet1.... ;-)

标签: google-apps-script google-sheets


【解决方案1】:

你的描述非常准确,用代码翻译起来很容易......

您应该尝试过,而且我相信文档会允许您运行它……运行您自己编写的代码会很有趣,也很值得!

这是一个更令人沮丧的(对你来说)工作代码的解决方案 ;-) 在 cmets 中有解释

function copySheetsToSS() {
  var ss = SpreadsheetApp.getActive();
  for(var n in ss.getSheets()){
    var sheet = ss.getSheets()[n];// look at every sheet in spreadsheet
    var name = sheet.getName();//get name
    if(name != 'master' && name != 'test'){ // exclude some names
      var alreadyExist = DriveApp.getFilesByName(name);// check if already there
      while(alreadyExist.hasNext()){
        alreadyExist.next().setTrashed(true);// delete all files with this name
      }
      var copy = SpreadsheetApp.create(name);// create the copy
      sheet.copyTo(copy);// copy content
      copy.deleteSheet(copy.getSheets()[0]);// remove original "Sheet1"
      copy.getSheets()[0].setName(name);// rename first sheet to same name as SS
    }
  }
}

【讨论】:

  • 精彩;奇迹般有效。除了我注意到我的异常没有放在数组中......哈哈!非常感谢,谢尔盖!
  • 糟糕;我高兴得太早了!新工作表已正确创建;但是每个单独选项卡的内容不会以某种方式复制。所以这个函数最终会创建具有正确名称的新电子表格,但所有单元格都是空白的。
  • 你是对的......;-) 我忘记了复制内容的部分!抱歉,代码已更新,请参阅编辑。(Ooooooops...:-)
  • 嗯,没有看到你自己完成了代码……很抱歉迟到了 :-) 好的一点是我们得到了几乎相同的代码!除了我不确定的删除表是一个不错的选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
  • 2022-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多