从formSubmit添加到Document的文件

时间:2012-07-02 03:57:15

标签: google-apps-script google-docs

我正在创建将执行下述操作的脚本。到目前为止,我已经设法让前两个部分正常运行,但我现在仍然坚持要做更多工作。我已经回顾了几个响应论坛并尝试了这些建议,但没有成功。

所需的脚本流程:  从电子表格表单提交的表单     完成字段:         时间戳         用户名(提交时收集的电子邮件)         学生         年级         干预计划         核心阅读/数学         团队(电子邮件列表)

1个脚本在onFormSubmit上运行,然后创建模板文档的副本,将该新副本重命名为以表格形式提交的e.value“student”,

2然后用表格中提交的值替换文档中的选定文本字符串。

3将编辑器添加到新文档并发送包含所需说明的通知

4创建活动(提交日期后一周)活动详细信息包括说明和链接到共享文档,供团队成员完成输入,将活动邀请发送到电子邮件列表。

到目前为止,这是工作脚本。

function formSubmitValues(e) {

  var timeStamp = e.values[0];
  var userEmail = e.values[1];
  var student = e.values[2];
  var grade = e.values[3];
  var conern = e.values[4];
  var readingCore = e.values[5];
  var mathCore = e.values[6];
  var interventions = e.values[7];
  var team = e.values[8].toString(); // "just to be sure"..Henrique says add .toString      this allowed the replaceText part to work

  //Makes copy of template document and renames
  var tempID = ("1Rq0pDAnuGNfL6W3GB0ZuLeWM2uYzHpKzoyxoXlwjtgE") // use document ID from Template Document
  var copyId = DocsList
              .getFileById(tempID)
              .makeCopy(student + " Initial Referral") // names new copy as student's name
              .getId();

// trying to add editors to new document using email list generated in form submit value of "team"
DocsList.getFileById(copyId).addEditors([team]); 




// replaces text within template with selected fields from formSubmitValues
  var doc = DocumentApp.openById(copyId)  
  var body = doc.getActiveSection();

    body.replaceText("%STUDENT%", student);
    body.replaceText("%DATE%", timeStamp);
    body.replaceText("%TEACHER%", userEmail);
    body.replaceText("%TEAM%", team);

  return doc;

}

报告的问题回复:以下是他们所说的:“该函数采用数组或字符串,如:DocsList.getFileById(copyId).addEditors(['parent@domain.com', 'parent2@domain.com']);

我尝试将电子邮件直接输入到这样的脚本中,并且工作正常。 所以我的问题不是'addEditors方法,而在于让表单提交的电子邮件正确传递。关于我将如何做到这一点的任何建议?

我已经尝试了我认为使用.toString()的所有组合,以及使用.Split(',')。

重新定义问题:因此,电子邮件是如何从e.values表单提交的。

这是我在的地方: 当我直接在电子邮件中输入电子邮件时:.addEditors(['parent@domain.com', 'email2@domain.net', 'email3@gmail.com'])它有效,(我必须将脚本中的addEditors方法移到.makeCopy之后而不是最后。) 这是Execution Transcript显示的内容: File.addEditors([[parent@domain.com, email2@domain.net]])并运行脚本的其余部分。注意:我不理解的一个部分是单引号,即'email'它们必须在脚本中键入,但在运行时不会显示在Transcript上。我已经尝试将它们放在表单中的电子邮件中,但它会使它们在Transcript中显示但仍然无法运行。

所以这就是现在的脚本:

var tempID = ("1Rq0pDAnuGNfL6W3GB0ZuLeWM2uYzHpKzoyxoXlwjtgE") // use document ID from Template Document
var copyId = DocsList
              .getFileById(tempID)
              .makeCopy(student + " - TestingCopy") // names new copy as student's name + text
              .addEditors([team.split(',')])  
              .getId();

但是当我使用带有或不带var team的{​​{1}}时,它不起作用。但是在成绩单中它显示: .split(',') 它看起来与什么时候显示的工作方式相同,但这是Transcript和编辑器中显示的最后一件事没有添加到文档中,脚本也没​​有完成。

我在这里显然不理解。有没有办法让我可以通过addEditors方法要求的方式处理团队e.values中的电子邮件?在电子表格单元格中,它们显示为CSV。即rreynolds @ domain.net,parent @ domain.com 他们必须一次阅读,还是什么?

我正在学习很多,并感谢你的帮助。我很抱歉对所有评论感到困惑,但我不确定在这个论坛中解决问题的正确方法。例如:我应该返回并编辑我的原始脚本以显示当前版本,还是将其添加到其他地方?我正在努力保持对话流畅,以便其他人更容易关注 - 谢谢抢劫

3 个答案:

答案 0 :(得分:0)

我建议了几件事

  1. 在代码中添加一些Logger.log语句以打印出调试信息。
  2. 在整个代码段周围添加一个try ... catch块并打印出异常。看看你是否有任何例外。
  3. 最后,使用Execution transcript窗口查看脚本停止的位置(如果有)。

答案 1 :(得分:0)

通过电子邮件添加编辑器有两种方法:addEditors([emailAddresses])addEditor(emailAddress)

第一个有一个“s”,需要一组电子邮件地址字符串,第二个需要一个字符串作为参数。您应该使用第二个或将[括号]添加到代码中的电子邮件字符串。

关于你的评论 //需要弄清楚在哪里/如何:.addEditors(email1,email2等);   //这是从DocsList还是DocumentApp类完成的?

addEditor()addEditors()属于file class,DocsList类的成员,您可以使用用户对象添加用户或用户电子邮件,如文档中所述。 它可以像DocFile.addEditors([email1,email2])

一样使用

编辑:很多关于这篇文章的评论,对不起,阅读已经变得非常不安了...我用电子表格测试了这些addEditors功能,它按预期工作,使用简单的数组用于多个用户电子邮件和单个电子邮件的字符串。 document service似乎存在addEditor()方法的问题,应将其报告给问题跟踪器。

已报告我已举报issue #1512 - Rocketrob

答案 2 :(得分:0)

请让我给出最后一个(希望)明确的答案:(感谢分享电子表格,这更容易处理; - )

这是您的代码完全正常工作。

我创建了一些中间变量来展示它是如何工作的。

    function formSubmitEditors(e) {

      // defines spreadsheet form events on submit of form.  This function formSubmitEditors is triggered on formSubmit
      var timeStamp = e.values[0];
      var fileName = e.values[1];
      var team = e.values[2].replace(/, /g,"|"); // remove unwanted spaces and commas replace by | for visibility ;-)
      Logger.log(team);// contains | as separators
      var teamArray = team.split('|');
      Logger.log(teamArray.length+'  :  '+teamArray);// check that it is an array of x elements

      //Makes copy of template document and renames
      var tempID = '1Rq0pDAnuGNfL6W3GB0ZuLeWM2uYzHpKzoyxoXlwjtgE' // use document ID from Template Document
      var copyId = DocsList
                  .getFileById(tempID)
                  .makeCopy(fileName + " - TestingCopy") // names new copy as student's name + text
                  .getId();                     // 
    var file = DocsList.getFileById(copyId).addEditors(teamArray);

    // replaces merged-text values within template with selected fields from formSubmitValues
      var doc = DocumentApp.openById(copyId)
      var body = doc.getActiveSection();

        body.replaceText("%FILE%", fileName);// you wrote %FILENAME% in place of %FILE%
        body.replaceText("%DATE%", timeStamp);
        body.replaceText("%TEAM%", team);// it will be shown with | as separators, if you don't like it replace team by teamArray.toString() to get commas again.
     }

编辑:我删除了团队事件的toString(),因为e.parameters已经是字符串,所以没有必要。

EDIT2:要完成并在初始问题中执行您需要的操作,您可以使用下一周创建Cal事件的代码替换代码的结尾,并发送带有指向doc的链接的邀请。

  var file = DocsList.getFileById(copyId).addEditors(editorsArray);
  var fileurl = file.getUrl();
  Logger.log(fileurl)

// replaces merged-text values within template with selected fields from formSubmitValues
  var doc = DocumentApp.openById(copyId)
  var body = doc.getActiveSection();

    body.replaceText("%FILE%", fileName);
    body.replaceText("%DATE%", timeStamp);
    body.replaceText("%MAILS%", editors);

  var Cal = CalendarApp.getCalendarsByName('testencodage')[0];// replace with your calendar name you want to use
  var newEvent = Cal.createAllDayEvent('Fill the questionnary', new Date(new Date(newtimeStamp).getTime()+7*24*3600*1000), { guests : e.values[2] , sendInvites : true , description :"Don't forget to fill this document "+fileurl})
 }