Javascript 如何阻止GoogleSheet生成重复表单?

Javascript 如何阻止GoogleSheet生成重复表单?,javascript,google-apps-script,google-sheets,google-forms,Javascript,Google Apps Script,Google Sheets,Google Forms,每次打开文件时,我都使用以下Google脚本代码生成备份 function copySheet() { var formattedDate = Utilities.formatDate(new Date(), "GMT-6", "yyyy-MM-dd' 'HH:mm:ss"); var name = SpreadsheetApp.getActiveSpreadsheet().getName() + " Copy " + form

每次打开文件时,我都使用以下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());
}
有一个表单链接到此工作表,并且每次该表单都会被复制。我该如何阻止这种情况发生?我希望每个备份副本都链接到同一个表单。我如何使用谷歌脚本呢

如果不可能,是否有其他方法生成备份以避免表单重复?

将同一表单链接到每个电子表格 我希望每个备份副本都链接到同一个表单。我如何使用谷歌脚本呢

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

选项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);
  }
})
将同一表格链接到每个电子表格 我希望每个备份副本都链接到同一个表单。我如何使用谷歌脚本呢

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

选项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);
  }
})

前面的答案是正确的。但是,可以断开表单链接,并使用将表单数据发布到各种电子表格,而无需依赖内置的表单电子表格链接。请参见前面的答案是正确的。但是,可以断开表单链接,并使用将表单数据发布到各种电子表格,而无需依赖内置的表单电子表格链接。请参见

是否有办法创建整个电子表格的副本,而不是单独复制表格@Aaron@Jerrymon您可以迭代所有工作表,或者使用当前代码,然后删除链接表单。我已经更新了我的答案,以显示这两个方面。有没有办法创建整个电子表格的副本,而不是单独复制工作表@Aaron@Jerrymon您可以迭代所有工作表,或者使用当前代码,然后删除链接表单。我已经更新了我的答案以显示这两个。是的,很好,您可以指示
onFormSubmit
触发器将行附加到每个电子表格中。但是,请注意,如果向表单中添加问题,目标工作表将不会像处理链接表单那样自动更新以反映这些问题,因此您必须处理代码中的这些更改。是的,很好,您可以指示
onFormSubmit
触发器将行附加到每个电子表格中。但是,请注意,如果向表单中添加问题,目标工作表将不会像处理链接表单那样自动更新以反映这些问题,因此您必须在代码中处理这些更改。