MailApp+SpreadsheetApp - 传递 object 属性 作为电子邮件主题

MailApp+SpreadsheetApp - passing an object property as an email subject

这里是菜鸟程序员。

我正在编写一个 gsheets 脚本,它应该从 google 表单中接收答案(将答案提交给 google sheets sheet), 将其格式化为电子邮件并邮寄给其他人。

我已经编写了将 header 和表单提交行放入 javascript object 中的代码,但我无法弄清楚我这样做的原因无法使用 object 的其中一个属性作为电子邮件的主题,我收到了电子邮件,但主题始终是“未定义的邮件测试”。

注意:ifEdit 方法作为 OnEdit 事件的 Installed 事件侦听器触发。

/* 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 触发器的编辑触发器,而这不会发生。