Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将Google工作表中的唯一值传递到HTML电子邮件模板_Javascript_Html_Google Apps Script_Google Sheets_Mapping - Fatal编程技术网

Javascript 如何将Google工作表中的唯一值传递到HTML电子邮件模板

Javascript 如何将Google工作表中的唯一值传递到HTML电子邮件模板,javascript,html,google-apps-script,google-sheets,mapping,Javascript,Html,Google Apps Script,Google Sheets,Mapping,我有一个谷歌表格,上面有项目数据(项目代码、名称、日期、项目负责人等),我正在尝试获取行数据,在本例中为唯一值。例如,如果电子邮件johndoe@testmail.com出现x次,行数据应被捕获并传递到html文件,然后通过电子邮件发送到johndoe@testmail.com与其他电子邮件相同。因此,特定的项目负责人应该只收到他们领导的项目的电子邮件。我是JavaScript/GAs方面的新手,已经做了大量的研究,但无法让它工作。我将非常感谢您的帮助 读取工作表的电子邮件脚本 function

我有一个谷歌表格,上面有项目数据(项目代码、名称、日期、项目负责人等),我正在尝试获取行数据,在本例中为唯一值。例如,如果电子邮件johndoe@testmail.com出现x次,行数据应被捕获并传递到html文件,然后通过电子邮件发送到johndoe@testmail.com与其他电子邮件相同。因此,特定的项目负责人应该只收到他们领导的项目的电子邮件。我是JavaScript/GAs方面的新手,已经做了大量的研究,但无法让它工作。我将非常感谢您的帮助

读取工作表的电子邮件脚本

function Getdata(){

const ss= SpreadsheetApp.getActiveSpreadsheet();
const ws= ss.getSheetByName("Projects");
const headers= ws.getRange("A1:J").getValues();
const Project_Code = headers[0][0];
const End_Date = headers[0][1];
const Project_Name = headers[0][2];
const New_End_Date = headers[0][3];
const Contact_Finance = headers[0][5];
const Update_client = headers[0][6];
const Project_Leader = headers[0][7];
const Email = headers[0][11];

const lr = ws.getLastRow();
const tableRangeValues=ws.getRange(2,1, lr-1,9).getDisplayValues();

const htmlTemplate = HtmlService.createTemplateFromFile("Notify") 
htmlTemplate.Project_Code = Project_Code;
htmlTemplate.End_Date= End_Date;
htmlTemplate.Project_Name= Project_Name;
htmlTemplate.New_End_Date=Complete;
htmlTemplate.Contact_Finance=Contact_Finance;
htmlTemplate.Update_client=Upadate_client;
htmlTemplate.Project_Leader=Project_Leader;
htmlTemplate.tableRangeValues=tableRangeValues;

const htmlForEmail = htmlTemplate.evaluate().getContent();


// This is the part where email loop should happen? and only send emails to individual project leaders listing only the projects they work on.

MailApp.sendEmail({
to: // emails based on loops?
subject: 'Projects Ending',
htmlBody: htmlForEmail,
//Logger.log(tableRangeValues);
 });
}
如何通过键值将一个数组分隔为多个数组 我建议使用将行数组组织到一个对象中,该对象将电子邮件作为键,行数组作为值(下面的示例)。 你最终会得到

{
"person1@email.com“:[[value1]、[value2]、[value3]],
"person2@email.com“:[[value1]、[value2]、[value3]],
//等等。
}    
请参阅下文,了解特定于您需求的减速机,但一般来说,其想法是

函数缩减器(对象、数组值){
常量键=数组值[索引键的索引];
如果(!(输入对象))对象[key]=[];
对象[key]。推送(arrayOfValues);
返回对象;
}
const groupedByKey=valuesFromSheet.reduce(reducer,{});
您可以通过相对较新添加到全局
对象的对象设置循环:
对象.entries()
。这将返回一个数组,以便您可以使用
array.prototype.forEach
(下面的示例)发送电子邮件

为每封电子邮件创建一个新模板。您应该利用Apps脚本的模板化功能来模块化模板。当您添加所有样式,然后开始添加scriplet标记时,它可能会变得非常混乱。我在下面演示了如何将表格模板与主电子邮件模板分离,并最终使用嵌套模板。这是更易于管理和调试/测试的

最后,我还始终建议在一个位置定义标题(请参见下面的
标题
对象),以便以后可以轻松更改标题顺序,而无需在多个位置更新代码(这是一种将错误引入脚本的简单方法)

代码.gs
const标题={
项目代码:0,
结束日期:1,
项目名称:2,
新的结束日期:3,
联系财务部:5,
更新客户:6,
项目负责人:7,
姓氏:8,
全名:9,
电邮:11
};
函数Getdata(){
const ss=SpreadsheetApp.getActiveSpreadsheet();
const ws=ss.getSheetByName(“项目”);
const headers=makeHeaders(ws.getRange(“A1:J”).getValues()[0]);
const lastRow=ws.getLastRow();
const tableRangeValues=ws
.getRange(2,1,最后一行-1,headers.EMAIL+1)
.getDisplayValues();
constGroupedByEmail=tableRangeValues.reduce(emailReducer,{});
Object.entries(groupedByEmail).forEach(函数(emailGroup){
const[email,values]=emailGroup;
MailApp.sendmail({
致:电邮:,
主题:“项目结束”,
htmlBody:MakeHtmlMail(值[0][标题.全名]、标题、值)
});
});
}
功能(组、行){
const email=行[headers.email];
如果(!(组中的电子邮件))组[电子邮件]=[];
组[email].push(row.slice(HEADINGS.PROJECT_CODE,HEADINGS.FULL_NAME+1));
返回组;
}
函数makeHtmlEmail(名称、标题、值){
const emailTemplate=HtmlService.createTemplateFromFile(“通知”);
emailTemplate.name=名称;
emailTemplate.header=标题;
emailTemplate.values=值;
返回emailTemplate.evaluate().getContent();
}
函数makeTable(标题、值){
const table=HtmlService.createTemplateFromFile(“表”);
table.header=页眉;
表1.3:数值=数值;
返回表.evaluate().getContent();
}
函数makeHeaders(headerRow){
返回[
headerRow[标题.项目代码],
headerRow[标题.结束日期],
headerRow[标题.项目名称],
headerRow[标题、新标题、结束日期],
headerRow[标题.联系财务部],
headerRow[标题.更新\u客户端],
headerRow[标题.项目负责人]
];
}
Notify.html

项目详情
table.html

如何通过键值将一个数组分隔为多个数组 我建议使用将行数组组织到一个对象中,该对象将电子邮件作为键,行数组作为值(下面的示例)。 你最终会得到

{
"person1@email.com“:[[value1]、[value2]、[value3]],
"person2@email.com“:[[value1]、[value2]、[value3]],
//等等。
}    
请参阅下文,了解特定于您需求的减速机,但一般来说,其想法是

函数缩减器(对象、数组值){
常量键=数组值[索引键的索引];
如果(!(输入对象))对象[key]=[];
对象[key]。推送(arrayOfValues);
返回对象;
}
const groupedByKey=valuesFromSheet.reduce(reducer,{});
您可以通过相对较新添加到全局
对象的对象设置循环:
对象.entries()
。这将返回一个数组,以便您可以使用
array.prototype.forEach
(下面的示例)发送电子邮件

为每封电子邮件创建一个新模板。您应该利用Apps脚本的模板化功能来模块化模板。当您添加所有样式,然后开始添加scriplet标记时,它可能会变得非常混乱。我在下面演示了如何将表格模板与主电子邮件模板分离,并最终使用嵌套模板。这是更易于管理和调试/测试的

最后,我还始终建议您在一个位置定义标题(请参见下面的
标题
对象),这样您以后就可以轻松地更改标题顺序,而无需在中更新代码