Javascript 在forEach循环中通过onclick将变量传递给函数-googleapps脚本

Javascript 在forEach循环中通过onclick将变量传递给函数-googleapps脚本,javascript,html,foreach,onclick,Javascript,Html,Foreach,Onclick,我正在尝试构建一个web应用程序,从电子表格中收集表格的内容。因此,我将电子表格的内容放在一个数组中,并使用带有forEach循环的JavaScript构建表。这一切正常,但我希望每行有一个单元格可以点击。单击单元格时,我想调用另一个javascript函数,并将相应行中其他单元格的内容作为变量传递。 我在单元格中添加了一个链接,该链接使用onclick事件调用函数。当我单击单元格时,我在控制台日志中看到,函数被调用了,但是我想要传递的变量没有定义 我认为问题在于,当点击单元格时,循环结束,变量

我正在尝试构建一个web应用程序,从电子表格中收集表格的内容。因此,我将电子表格的内容放在一个数组中,并使用带有forEach循环的JavaScript构建表。这一切正常,但我希望每行有一个单元格可以点击。单击单元格时,我想调用另一个javascript函数,并将相应行中其他单元格的内容作为变量传递。 我在单元格中添加了一个链接,该链接使用onclick事件调用函数。当我单击单元格时,我在控制台日志中看到,函数被调用了,但是我想要传递的变量没有定义

我认为问题在于,当点击单元格时,循环结束,变量不再定义。但我完全不知道这个问题的解决方法

我的HTML文件和javascript代码(我在//Table JS一节中讨论了else,基本上在代码的末尾):


以表格为中心{
表布局:固定;
宽度:100%;
}
运输署{
宽度:25%;
}
div.add-form{
宽度:50%;
}
布赫欣祖富根酒店
布奇特尔:
布赫托尔:
伪装:
欣祖夫根 布克莱斯特 布奇特尔 布赫托尔 伪装 地位 //布赫欣祖富根酒店 document.getElementById(“btn”)。addEventListener(“单击”,doStuff); 函数doStuff(){ var titel=document.getElementById(“titel”).value; var autor=document.getElementById(“autor”).value; var auflage=document.getElementById(“auflage”).value; //验证窗体 如果(滴度=“”| |自动=“”| |伪装=“”){ 警惕(“费勒:阿勒·费尔德·穆森·奥斯格夫·尤利特·塞恩!”); 返回false; } //PassInfoToGogleScript google.script.run.addInfo(titel、autor、auflage); //clearInputFields document.getElementById(“titel”).value=“”; document.getElementById(“autor”).value=“”; document.getElementById(“auflage”).value=“”; } //表JS document.addEventListener(“DOMContentLoaded”,function()){ google.script.run.withSuccessHandler(addElementsToTable.getTableData(); }); 函数加法器表(数据){ var tbody=document.getElementById(“表体”); data.forEach(函数(r){ var行=document.createElement(“tr”); var col1=document.createElement(“td”); col1.textContent=r[0]; var col2=document.createElement(“td”); col2.textContent=r[1]; var col3=document.createElement(“td”); col3.textContent=r[2]; var col4=document.createElement(“td”); 如果(r[3]=“nicht verfügbar”){ console.log(“nicht verfügbar erkannt”); col4.textContent=r[3]+“Klick zum Zurückgeben”; col4.setAttribute(“样式”,“背景色:#E40046;颜色:#ffffff”); } 否则{ console.log(“verfügbar erkannt”); var link=document.createElement(“a”); setAttribute(“onclick”,“test(r[0],r[1],r[2])”; link.textContent=r[3]+“|Klick zum Ausleihen”; setAttribute(“样式”、“颜色:#ffffff;”); col4.setAttribute(“样式”,“背景色:#00965E;”); col4.appendChild(link); } 行。追加子行(col1); 行。追加子行(col2); 第行。追加子项(col3); 第行。追加子行(col4); tbody.appendChild(世界其他地区); }); } 功能测试(滴度、自动、伪装){ 控制台日志(“测试”); log(“Titel:+Titel+”| Autor:+Autor+| Auflage:+Auflage”); }
错误消息:
“未捕获引用错误:在HtmlanchoreElement.onclick中未定义r”

不要在现代程序中使用
onxyz
属性进行事件处理。他们创建的函数是在全局范围内创建的。您的
r
变量是函数调用的本地变量

相反,请使用现代事件处理:

link.addEventListener("click", function() {
    test(r[0], r[1], r[2]);
});
单击时,将调用
test
,并使用
r
中的当前值。事件处理程序关闭
r

实例:

var fakeData=[
[
“第一行值0”,
“第一行值1”,
“第一行值2”,
“第一行值3”
],
[
“第二行值0”,
“第二行值1”,
“第二行值2”,
“不可能”
],
[
“第三行值0”,
“第三行值1”,
“第三行值2”,
“第三行值3”
]
];
功能测试(x、y、z){
控制台日志(x,y,z);
}
var tbody=document.getElementById(“主体”);
fakeData.forEach(函数(r){
var行=document.createElement(“tr”);
var col1=document.createElement(“td”);
col1.textContent=r[0];
var col2=document.createElement(“td”);
col2.textContent=r[1];
var col3=document.createElement(“td”);
col3.textContent=r[2];
var col4=document.createElement(“td”);
如果(r[3]=“nicht verfügbar”){
console.log(“nicht verfügbar erkannt”);
col4.textContent=r[3]+“Klick zum Zurückgeben”;
col4.setAttribute(“样式”,“背景色:#E40046;颜色:#ffffff”);
}
否则{
console.log(“verfügbar erkannt”);
var link=document.createElement(“a”);
link.addEventListener(“单击”,函数(){
测试(r[0],r[1],r[2]);
});
link.textContent=r[3]+“|Klick zum Ausleihen”;
setAttribute(“样式”、“颜色:#ffffff;”);
col4.setAttribute(“样式”,“背景色:#00965E;”);
可乐
link.addEventListener("click", function() {
    test(r[0], r[1], r[2]);
});