我正在创建将执行下述操作的脚本。到目前为止,我已经设法让前两个部分正常运行,但我现在仍然坚持要做更多工作。我已经回顾了几个响应论坛并尝试了这些建议,但没有成功。
所需的脚本流程: 从电子表格表单提交的表单 完成字段: 时间戳 用户名(提交时收集的电子邮件) 学生 年级 干预计划 核心阅读/数学 团队(电子邮件列表)
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 他们必须一次阅读,还是什么?
我正在学习很多,并感谢你的帮助。我很抱歉对所有评论感到困惑,但我不确定在这个论坛中解决问题的正确方法。例如:我应该返回并编辑我的原始脚本以显示当前版本,还是将其添加到其他地方?我正在努力保持对话流畅,以便其他人更容易关注 - 谢谢抢劫
答案 0 :(得分:0)
我建议了几件事
最后,使用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})
}