【问题标题】:copyTo using {contentsOnly:true} not working使用 {contentsOnly:true} 的 copyTo 不起作用
【发布时间】:2013-02-13 22:54:14
【问题描述】:

需要注意的是,我对 Google Apps 脚本非常陌生。我很感激可以提供的任何帮助。

我正在尝试将工作表的内容复制到新文档中。这段代码没有任何问题:

// Create a new Spreadsheet and copy the current sheet into it.
var newSpreadsheet = SpreadsheetApp.create("Spreadsheet to export");
var projectname = SpreadsheetApp.getActiveSpreadsheet();
sheet = originalSpreadsheet.getActiveSheet();
sheet.copyTo(newSpreadsheet);

但是,这会复制当前工作表中的公式 - 我只是尝试复制值,因为公式引用了原始文档中其他工作表上的数据。

我的尝试如下:

// Create a new Spreadsheet and copy the current sheet into it.
var newSpreadsheet = SpreadsheetApp.create("Spreadsheet to export");
var projectname = SpreadsheetApp.getActiveSpreadsheet();
sheet = originalSpreadsheet.getActiveSheet();
sheet.copyTo(newSpreadsheet, {contentsOnly:true})

但是,这会产生以下错误:找不到方法(类)copyTo($Proxy914,object)。

我不确定我做错了什么。任何援助将不胜感激。提前致谢!

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    实际上有2个copyTo,一个applies to sheet,另一个applies to Range

    根据文档(参见上面的链接),第二个具有可选参数,仅用于复制值,而第一个没有。

    我猜你可以做的是使用Range.copyTo() 将整个工作表范围复制到一个临时工作表(在同一个电子表格中),然后将该临时工作表复制到另一个电子表格,最后从源中删除临时工作表电子表格。

    希望它足够清楚;-)

    【讨论】:

      【解决方案2】:

      在脚本库中有一个名为 spreadsheetFrozenBackup 的脚本,通过它可以制作电子表格的副本。

      使用了 Serge 提到的 range.copyTo。

      这不是一个很长的脚本,所以我在这里复制它以供参考:

      // Make copy of current spreadsheet with backup name.                  
      function spreadsheetFrozenBackup() {
      
        // Get current spreadsheet.
        var ss = SpreadsheetApp.getActiveSpreadsheet();                     
      
        // Name the backup spreadsheet with date.
        var bssName = ss.getName() + " frozen at " + Utilities.formatDate(new Date(), "GMT", "yyyyMMdd HHmmss");
        var bs = SpreadsheetApp.openById((DocsList.copy(DocsList.getFileById(ss.getId()), bssName)).getId());
      
        // Make sure all the formulae have been evaluated...                     
        SpreadsheetApp.flush();
      
        // Get all the sheets in the spreadsheet
        var bsl = bs.getSheets();    
      
        var pl = "";
        for (var i = 0; i < bsl.length; i++) {
          bsl[i].getDataRange().copyTo(bsl[i].getDataRange(), {contentsOnly:true});
      
          pl = pl + " " + bsl[i].getName();
          SpreadsheetApp.getActiveSpreadsheet().toast(pl, "Processed Sheets");
        }  
        SpreadsheetApp.getActiveSpreadsheet().toast(bssName, "Frozen Backup");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-12
        • 2018-12-29
        • 2015-10-02
        • 2014-04-15
        相关资源
        最近更新 更多