在电子表格脚本中,我想向用户发送邮件,这些用户会将邮件指向允许他们输入数据的表单的网址。我试过了:
function test1(){
var formID = FormApp.getActiveForm();
var formUrl = DriveApp.getUrl(formID);
sendMail(formUrl);
return
}
这会失败,因为formID的值总是为NULL。
答案 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
)form.getId()
。 答案 2 :(得分:0)
我知道这是一个老问题,但是我仍然会添加一个可能涉及的答案。 @ user3717023的答案很好用,但是对于大多数用例,有一个更好的方法。
通常来说,Form
连接到Sheet
,而不是Spreadsheet
本身。因此,获取所有Spreadsheet
表单的一种方法是遍历Sheet
的{{1}},并获取其表单URL,如下所示:
Spreadsheets
如果这种方式对您而言不是最佳选择(例如,您的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