Json MailApp+;SpreadsheetApp-将对象属性作为电子邮件主题传递
我是noob程序设计师 我正在编写一个gsheets脚本,它应该从谷歌表单(将答案提交到谷歌表单)接收答案,将其格式化为电子邮件并将其发送给其他人 我已经编写了将标题和表单提交行放入javascript对象的代码,但我无法找出为什么我不能使用对象的属性之一作为电子邮件的主题,我收到了电子邮件,但主题始终为“邮件测试未定义” 注意:ifEdit方法作为OnEdit事件的已安装事件侦听器触发Json MailApp+;SpreadsheetApp-将对象属性作为电子邮件主题传递,json,object,google-apps-script,google-sheets,gmail,Json,Object,Google Apps Script,Google Sheets,Gmail,我是noob程序设计师 我正在编写一个gsheets脚本,它应该从谷歌表单(将答案提交到谷歌表单)接收答案,将其格式化为电子邮件并将其发送给其他人 我已经编写了将标题和表单提交行放入javascript对象的代码,但我无法找出为什么我不能使用对象的属性之一作为电子邮件的主题,我收到了电子邮件,但主题始终为“邮件测试未定义” 注意:ifEdit方法作为OnEdit事件的已安装事件侦听器触发 /* DEFINE GLOBAL VARIABLES */ function globalVariables
/* DEFINE GLOBAL VARIABLES */
function globalVariables(){
let varArray = {
spreadsheetId : 's0mer4nd0mIdnumb3r',
sheetID : '0',
sheetName : 'sheetname'
};
return varArray;
}
function ifEdit(event) {
let range = event.range;//The range of cells edited
let columnOfCellEdited = range.getColumn();//Get column number
let emailAddress = "generic@email.com.zb";
let message = JSON.stringify(
convertToObjects(
getSheetHeaderAsArray(range.getSheet()),
getRowAsArray(range.getRow(), range.getSheet())
)).toString();
let subject = "Mail test " + message["MATERIAL"];
if (columnOfCellEdited === 1 && range.getSheet().getName() == globalVariables().sheetName) {// Column 1 is Column A
range.setNote('Edited at +' + new Date());
Logger.log(emailAddress + subject + message);
MailApp.sendEmail(emailAddress, subject, message);
};
}
/** AUXILIARY **/
function convertToObjects(headers, rows){
let result = {};
headers[0].forEach((headers, i) => result[headers] = rows[0][i]);
console.log(result);
return result;
}
function getSheetHeaderAsArray(sheet){
let header = sheet.getRange(1, 1, 1, 14).getValues();
//Logger.log(header);
return header;
}
function getRowAsArray(editedRowNum, sheet){
let rowArray = sheet.getRange(editedRowNum, 1, 1, 14).getValues();
//Logger.log(rowArray);
return rowArray;
}
我认为这可能接近你想要实现的目标:
function ifEdit(e) {
const sh=e.range.getSheet();
const emailAddress = "generic@email.com.zb";
const hA=sh.getRange(1,1,1,sh.getLastColumn()).getValues()[0];
const rA=sh.getRange(e.range.rowStart,1,1,sh.getLastColumn()).getValues()[0];
let mObj = {};
hA.forEach((h,i)=>{mObj[h]=rA[i];});
const message = hA.join(',') + '\n' + rA.join(',');
let subject = "Mail test " + mObj["MATERIAL"];
if (e.range.rowStart == 1 && range.getSheet().getName() == globalVariables().sheetName) {// Column 1 is Column A
range.setNote('Edited at +' + new Date());
Logger.log(emailAddress + subject + message);
MailApp.sendEmail(emailAddress, subject, message);
};
}
但不幸的是,我相信您期望onFormSubmit触发器触发编辑触发器,但这不会发生。您是否意识到OneEdit触发器仅在用户编辑时触发?这可能会有更好的机会工作
消息[“MATERIAL”]代码>如果您没有将消息字符串化,在我看来,您试图在链接到表单的工作表上运行onEdit()触发器,假设onFormSubmit编辑将在onEdit触发器上触发,我认为不会。实际上我没有,但幸运的是,将触发器从onEdit更改为onFormSubmit修复了此问题,但由于某些原因,现在它将.setNote应用于范围内的每个单元格。谢谢!我不得不重写它的某些原因,但它的工作预期!你说的编辑触发器没有基于编辑激活是对的,所以我将触发器从编辑更改为OnFormSubmit。现在我只需要让邮件正文看起来漂亮:D