1

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

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

1个脚本运行onFormSubmit,然后创建模板文档的副本,将新副本重命名为e.value“学生”以表单提交,

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而不是结尾。)这就是执行记录显示的内容: File.addEditors([[parent@domain.com, email2@domain.net]])它运行脚本的其余部分。注意:我不明白的一部分是单引号,即“电子邮件”它们必须在脚本中输入,但运行时不会显示在 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有或没有.split(',')它时,它不起作用。但是在 Transcript 中它显示: File.addEditors([[rreynolds@domain.net, parent@domain.com]]) 这看起来与它何时工作时显示的相同,但这是 Transcript 中显示的最后一件事,并且编辑器没有添加到文档中,并且脚本没有完成。

我显然不明白这里的东西。有没有办法让团队 e.values 中的电子邮件以 addEditors 方法所需的方式处理?在电子表格单元格中,它们显示为 CSV。即 rreynolds@domain.net、parent@domain.com 是否必须一次阅读一个或其他内容?

我学到了很多东西,感谢您的帮助。对于所有评论的混淆,我深表歉意,但我不确定在这个论坛中解决问题的正确方法。例如:我应该返回并编辑我的原始脚本以显示当前版本,还是将其添加到其他地方?我正在努力保持对话顺畅,以便其他人更容易理解 - 谢谢 rob

4

3 回答 3

0

我建议几件事

  1. 在代码中添加一些 Logger.log 语句以打印出调试信息。
  2. 在整个代码段周围添加一个 try ... catch 块并打印出异常。看看你是否有任何异常。

最后,使用执行脚本窗口查看脚本停止的位置(如果有)。

于 2012-07-02T04:42:51.150 回答
0

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

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

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

addEditor()并且addEditors()属于文件类,是 DocsList 类的成员,您可以按照文档中的说明使用用户对象用户电子邮件添加用户。可以这样使用DocFile.addEditors([email1,email2])

编辑:这篇文章有很多评论,对此感到抱歉,它变得非常难以阅读......我用电子表格测试了这些 addEditors 功能,它按预期工作,对多个用户电子邮件使用简单的数组,对单个电子邮件使用字符串。该方法document service似乎有问题,addEditor()应将其报告给问题跟踪器。

已报告我已报告问题 #1512 - Rocketrob

于 2012-07-02T08:34:28.260 回答
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 事件并发送带有文档链接的邀请的代码。

  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})
 }
于 2012-07-05T16:16:58.460 回答