【问题标题】:get form URL from a spreadsheet bound Form从电子表格绑定的表单中获取表单 URL
【发布时间】:2014-08-09 20:42:55
【问题描述】:

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

function test1(){

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

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

【问题讨论】:

    标签: google-apps-script google-forms


    【解决方案1】:

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

    使用

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

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

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

    没有返回链接到给定电子表格的表单列表的内置方法;这是 Apps 脚本问题跟踪器中的 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() 放在了一个try 块中,因为此方法会引发错误,即表单的目标电子表格恰好被删除(而不是仅仅返回null
    • 要获取表单 ID 列表而不是 URL,请在函数中使用 form.getId()

    【讨论】:

      【解决方案2】:

      因为您在电子表格中工作,所以您需要从电子表格对象中获取关联的表单(例如 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);
        }
      }
      

      【讨论】:

      • 感谢@Cyrus 让我更接近了一点。但是,我现在收到错误“API 方法 'getFormUrl' 在新版本的 Google 表格中尚不可用。”我想我现在必须将 URL 硬编码到电子表格中。
      • @MalcL,很抱歉,我应该验证代码片段。我修改了我的原始帖子以显示获取已发布网址的不同方式。您可能需要调整逻辑,假设表单和电子表格具有相同的文件名,并存储在云端硬盘的同一文件夹中。
      • 到目前为止,getFormUrl() 在新表格中有效;但正如elsewhere 所述,它只返回一个表单网址。我为多种形式的情况添加了一个答案,该答案部分基于您的答案,但不对文件名做出假设。
      【解决方案3】:

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

      一般来说,Form 连接到 Sheet,而不是连接到 Spreadsheet 本身。因此,获取所有Spreadsheet 表单的一种方法是通过SpreadsheetsSheets,并获取它们的表单URL,如下所示:

      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;
      }
      

      Docs

      如果这种方式不适合您(例如,您的 Spreadsheet 中的 Sheets 太多,而其中只有少数链接到 Forms),那么 @987654333 仍有可能您需要捕获的@s 存储在同一个Folder 中。在这种情况下,无需搜索整个Drive 来捕获它们,您可以使用相同的方法,但使用Folder

      function linkedForms() {
        var ssId = SpreadsheetApp.getActiveSpreadsheet().getId();
        var formList = [];
        var folder = DriveApp.getFolderById(yourFolderId);
        var files = folder.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;
      }
      

      Docs

      【讨论】:

      • TypeError: sheet.getFormUrl(...).getId 不是函数
      • @arulselvan 确定您无法获取 URL 的 ID - URL 是字符串,它不能有 ID。你从哪里弄来的?
      猜你喜欢
      • 2014-07-08
      • 2014-08-08
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多