【问题标题】:Google sheets appscript to copy tabs to new sheets谷歌工作表应用脚本将标签复制到新工作表
【发布时间】:2020-12-09 17:21:54
【问题描述】:

我有一个包含大约 190 个标签的 Google 表格,我需要将其拆分为 190 个不同的文件 文件需要与选项卡命名相同,选项卡的内容需要复制为值,但我还需要将格式设置为交叉(而不是公式)。

我环顾四周,通过结合之前的问答加上使用函数列表帮助形成了以下代码。它实际上适用于前几个选项卡,但随后会引发有关无法删除唯一工作表的错误。

    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.deleteSheet(copy.getSheets()[0]);// remove original "Sheet1"
copy.getSheets()[0].setName(name);// rename first sheet to same name as SS
      
      
var target_sheet = copy.getSheetByName(name);
var source_range = sheet.getRange("A1:M50");
var target_range = target_sheet.getRange("A1:M50");
      
var values = source_range.getValues();

target_range.setValues(values);

    }
  }
}

我希望有人能告诉我我做错了什么,因为我现在无法弄清楚。我也对更好的解决方案持开放态度,但请注意我是 google appscript 的初学者,请不要太复杂。

谢谢

【问题讨论】:

  • 我猜这个错误很明显。您不能删除最后一张纸。换句话说,一个电子表格文件需要至少有一张纸。事实上,您甚至无法隐藏所有工作表。至少需要一个可见的。
  • 'sheet.copyTo(copy); ' 行正在复制一张纸,所以在我删除第一张纸的时候应该有 2 张纸,这意味着 1 会留下,但是是的,这就是我出错的地方

标签: google-apps-script google-sheets


【解决方案1】:

原则上,您的脚本会在删除预先存在的表格之前正确地将新表格添加到新电子表格中

但是,请注意,对SpreadsheetApp 等服务的调用是异步的。

这变得越明显,脚本运行的时间越长。

在您的情况下,这显然会导致在创建新工作表之前删除唯一工作表的行为。

为避免这种情况,您可以通过实现对SpreadsheetApp.flush() 的调用来强制执行同步。

这将确保在插入新工作表之前不会删除旧工作表。

示例:

copy.deleteSheet(copy.getSheets()[0]);// remove original "Sheet1"
SpreadsheetApp.flush();
copy.getSheets()[0].setName(name);

您可能还想在代码同步运行很重要的其他位置引入call toflush()`。

【讨论】:

  • 谢谢,这绝对是问题所在,您已经解释得很好。除了我的删除命令,我可以让 flush() 为所有内容工作!但是你已经为我解决了这个问题,因为我现在已经从主函数中删除了工作表删除,并且将简单地创建一个单独的函数来删除工作表 1。一旦我对 appscript 进行了更多练习并且对我在做什么有了更多的了解,我将返回制作 main 函数。
猜你喜欢
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
相关资源
最近更新 更多