不同的 Google 表单 Urls(如何在大型 Spreadsheet 中找到链接的 "Form Responses" sheet)?

Different Google Form Urls (How to find the linked "Form Responses" sheet) in a large Spreadsheet?

一个 Google Spreadsheet 有几个 sheet,其中一些 link 编辑到 Google 表格。 我尝试使用 this example,但找不到 linked sheet。 在一种情况下,它向没有任何域的表单显示 link,但是 sheet.getFormUrl() returns link 带有域和另一个表单的 ID!当我使用 link 时,它首先在浏览器中被替换 link (没有域)。在这种情况下如何找到 linked sheet 以及为什么 links 不同?!

我有 onFormSubmit 事件处理程序(在表单端):

/** 
 *  This function is retrieved by onFormSubmit Trigger on the Form side (not on Spreadsheet side)
 * 
 *  
 *  View / Show Manifest file:
 *  Add:
 *    "oauthScopes": [
 *      "https://www.googleapis.com/auth/forms",
 *      "https://www.googleapis.com/auth/spreadsheets"
 *    ]
 */
function onFormSubmit(event) {
  try {
    Logger.log(JSON.stringify(event));

    const sheet = getLinkedSheet(event);
    if(sheet) {
      Logger.log(sheet.getName());
    }

  } catch (err) {
    Logger.log(err.toString());
  }
}

function getLinkedSheet(event) {
  // Get the form to which this script is bound.
  //var form = FormApp.getActiveForm();
  //OR:
  var form = event.source; 
  var destinationId = form.getDestinationId();

  //No domain: https://docs.google.com/forms/d/e/**[ID1]**/viewform <------------- A
  var formURL = form.getPublishedUrl(); 

  var formID = form.getId();

  Logger.log("Form's URL:" +formURL);

  var ss = SpreadsheetApp.openById(destinationId);

  var sheets = ss.getSheets();  
  var match = null;
  for(var i=0; i<sheets.length; i++) {  

    //With domain: https://docs.google.com/a**/[DOMAIN]**/forms/d/**[ID2]**/viewform <----------- B
    Logger.log(JSON.stringify( sheets[i].getFormUrl() ) ); 

    if(sheets[i].getFormUrl() == formURL) {
      match = sheets[i]; //<----------------------- NO MATCHES FOUND
    }
  }

  Logger.log(JSON.stringify(match)); //null
  return match;
}

我遇到了同样的问题,并已在 https://issuetracker.google.com/issues/128732931 提交了错误报告。

为了解决这个问题,我打开每个 sheet 的 formUrl 的表单,然后检查和比较表单 ID:

var form = FormApp.getActiveForm();
var formId = form.getId();
const matches = spreadSheet.getSheets().filter(function (sheet) {
  var sheetFormUrl = sheet.getFormUrl();
  if (sheetFormUrl){
    return FormApp.openByUrl(sheetFormUrl).getId() === formId;
  }
});
const sheet = matches[0]