【问题标题】:How do I stop Google sheet from generating duplicating forms?如何阻止 Google 工作表生成重复表单?
【发布时间】:2020-09-30 15:50:58
【问题描述】:

我每次打开文件时都使用以下 Google 脚本代码生成备份。

function copySheet() {
  var formattedDate = Utilities.formatDate(new Date(), "GMT-6", "yyyy-MM-dd' 'HH:mm:ss");
  var name = SpreadsheetApp.getActiveSpreadsheet().getName() + " Copy " + formattedDate;
  var destination = DriveApp.getFolderById("18aW0o_L1jngSjZ56aKGjt29JwTE1OQZf");
  var file = DriveApp.getFileById(SpreadsheetApp.getActiveSpreadsheet().getId())
  var sh = SpreadsheetApp.openById(file.makeCopy(name, destination));
  var ss = sh.getSheets()[0];
  ss.getRange(1,1,ss.getLastRow(),ss.getLastColumn()).setValues(ss.getRange(1,1,ss.getLastRow(),ss.getLastColumn()).getValues());
}

有一个链接到此工作表的表格,并且每次表格都会重复。我该如何阻止这种情况发生?我希望每个备份副本都与相同的表单链接。我怎样才能使用谷歌脚本来做到这一点?

如果不可能,是否有任何其他方法可以生成备份以使表单不会重复?

【问题讨论】:

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


    【解决方案1】:

    将相同的表单链接到每个电子表格

    我希望每个备份副本都链接到同一个表单。我如何使用 Google Script 来做到这一点?

    很遗憾,这是不可能的。一个表单一次只能链接到一个电子表格。

    选项 1:复制单个工作表

    防止重复表单的一种方法:不要创建电子表格的副本,而是创建一个新的空白电子表格,然后将单个工作表(或多个工作表)复制到该电子表格。

    /**
     * Create a new spreadsheet in the folder, and copy the sheet to it.
     */
    function duplicateSpreadsheetF(filename, sourceSpreadsheet, folder) {
      // Create a new blank file
      var spreadsheet = SpreadsheetApp.create(filename)
      // Move to the folder
      var file = DriveApp.getFileById(spreadsheet.getId())
      file.moveTo(folder)
    
      // Copy the sheets from the source
      sourceSpreadsheet.getSheets().forEach(function(sheet){
        sheet.copyTo(spreadsheet).setName(sheet.getName())
      })
     
      // Remove the default blank Sheet1
      var blankSheet = spreadsheet.getSheetByName('Sheet1')
      if (blankSheet) spreadsheet.deleteSheet(blankSheet)
    
      return spreadsheet
    }
    

    当您只复制单个工作表时,副本不会链接到任何表单 - 它只是工作表上数据的副本。

    选项2:复制后删除表格

    您可以将其附加到现有代码中。它将遍历备份副本上的所有工作表,并取消链接 - 然后删除 - 链接到每个工作表的任何表单。

    // Unlink and delete all forms that are linked to spreadsheet sh
    sh.getSheets().forEach(function(sheet){
      // Get form attached to sheet
      var formUrl = sheet.getFormUrl();  // returns null if there is no linked form 
      if (formUrl) {           
        var form = FormApp.openByUrl(formUrl);
    
        // Unlink the form
        form.removeDestination();
    
        // Delete the form
        DriveApp.getFileById(form.getId()).setTrashed(true);
      }
    })
    

    【讨论】:

    • 有没有办法创建整个电子表格的副本而不是单独复制工作表? @亚伦
    • @Jerrymon 您可以遍历所有工作表,或者使用您当前的代码,然后删除链接的表单。我已经更新了我的答案以显示这两个。
    【解决方案2】:

    前面的答案是正确的。但是,可以取消链接表单并使用onFormSubmit of form 将表单数据发布到各种电子表格,而无需依赖内置的表单-电子表格链接。见sample here

    【讨论】:

    • 是的,很好,您可以指示onFormSubmit 触发器将行附加到每个电子表格。但是,请注意,如果您向表单添加问题,目标工作表不会像链接表单那样自动更新以反映这些问题,因此您必须在代码中处理这些更改。
    猜你喜欢
    • 1970-01-01
    • 2014-07-28
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 2018-01-23
    相关资源
    最近更新 更多