从电子表格绑定表单中获取表单URL

时间:2014-08-09 20:42:56

标签: google-apps-script google-form

在电子表格脚本中,我想向用户发送邮件,这些用户会将邮件指向允许他们输入数据的表单的网址。我试过了:

function test1(){

  var formID = FormApp.getActiveForm();
  var formUrl = DriveApp.getUrl(formID);
  sendMail(formUrl);
  return
}

这会失败,因为formID的值总是为NULL。

3 个答案:

答案 0 :(得分:3)

因为您正在使用电子表格,所以需要从Spreadsheet对象中获取相关表单(例如SpreadsheetApp.getActiveSpreadsheet.getFormUrl())。

您还需要使用htmlBody可选参数发送邮件消息。

这是一个代码片段:

function sendNotice(recipient){
  try{

    // either hardcode the folder id below
    var formStorageFolderId = '';

    // or programmatically get the folder from the spreadsheet parent
    var ss = SpreadsheetApp.getActiveSpreadsheet();

    var ssFolder = DriveApp.getFileById(ss.getId()).getParents();
    if(ssFolder.hasNext()){
      // assume there is only one parent folder
      formStorageFolderId = ssFolder.next().getId();
    }

    var formFolder = DriveApp.getFolderById(formStorageFolderId);

    var files = DriveApp.getFilesByType(MimeType.GOOGLE_FORMS);
    var formId = '';
    while(files.hasNext()){
      // search for the form (is it the same name as the spreadsheet?)
      var file = files.next();
      var fileName = file.getName();
      var sheetName = ss.getName();
      if(fileName == sheetName){
        // matched names

        formId = file.getId();
        break;
      }
    }
    if(formId){
      var actualForm = FormApp.openById(formId);
      var formName = actualForm.getTitle();
      var formURL = actualForm.getPublishedUrl();

      var subject = "Please fill out form";
      // html mail message (needed for the link
      var mailBody = '<div><p>Please fill out the attached form<p>';
      mailBody += '<p><a href="' + formURL +'">' + formName + '</a>';

      MailApp.sendEmail(recipient, subject, '',{htmlBody:mailBody});
    }

  }catch(err){
    Logger.log(err.lineNumber + ' - ' + err);
  }
}

答案 1 :(得分:2)

如果有一个表单链接到电子表格

使用

var ss = SpreadsheetApp.getActiveSpreadsheet(); // or openById, etc
var formUrl = ss.getFormUrl();

获取其Url。如果需要,FormApp.openByUrl(formUrl);返回指向表单的指针,该指针允许任何其他方法。

链接到电子表格的多个表单

没有内置方法可以返回链接到给定电子表格的表单列表;这是Apps Script问题跟踪器中的open issue。解决方法是搜索所有表单(as Cyrus Loree did),获取每个表单的目标,并返回目标是感兴趣的电子表格的列表。这是如何:

function linkedForms() {
  var ssId = SpreadsheetApp.getActiveSpreadsheet().getId();
  var formList = [];
  var files = DriveApp.getFilesByType(MimeType.GOOGLE_FORMS);
  while (files.hasNext()) {
    var form = FormApp.openByUrl(files.next().getUrl());
    try {
      if (form.getDestinationId() == ssId) {
        formList.push(form.getPublishedUrl());
      }
    }
    catch(e) {
    }
  }
  return formList;
}

备注:

  • 我将form.getDestinationId()放入试用版块中,因为此方法会错误地删除表单的目标电子表格(而不仅仅是返回null
  • 要获取表单ID而不是Url的列表,请在函数中使用form.getId()

答案 2 :(得分:0)

我知道这是一个老问题,但是我仍然会添加一个可能涉及的答案。 @ user3717023的答案很好用,但是对于大多数用例,有一个更好的方法。

通常来说,Form连接到Sheet,而不是Spreadsheet本身。因此,获取所有Spreadsheet表单的一种方法是遍历Sheet的{​​{1}},并获取其表单URL,如下所示:

Spreadsheets

Docs

如果这种方式对您而言不是最佳选择(例如,您的function getFormsOfSpreadsheet(spreadsheetId) { const ss = SpreadsheetApp.openById(spreadsheetId); const sheets = ss.getSheets(); const formsUrls = []; for (const sheet of sheets) { const formUrl = sheet.getFormUrl(); // getFormUrl() returns null if no form connected if (formUrl) { formsUrls.push(formUrl); } } return formsUrls; } 中的Sheet太多,而其中只有少数链接到Spreadsheet),那么仍然您需要捕获的Form被存储在同一Form中的可能性。在这种情况下,无需搜索整个Folder即可捕获它们,您可以使用相同的方法,但是使用Drive

Folder

Docs