(情况)
我的表中有一堆数据,每一行的列末尾都有一个按钮。数据来自电子表格,我在Modal对话框中显示了表格。因此,每当我单击表中的按钮时,程序都会根据该行在Google电子表格中运行/.setValue()。因此,如果按钮在第1行,它也会在电子表格中运行/.setValue()第1行。
(问题)
现在,如果我在模式对话框中创建过滤函数,并根据名称对其进行过滤,则很少有行会丢失。在筛选完表格后(假设第3行变成了第1行),每当我点击按钮时,它都会运行电子表格中的第一行,但它假定运行的是第3行。
(问题)
因此,问题是如何保持行值不变,即使我过滤了它?
(我的代码GS GET表)
function getTable(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Query_Script");
var data = sheet.getDataRange().getDisplayValues();
Logger.log(data);
return {'success': true,'data':data};
}
function getRow(row,column){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Query_Script");
var dataRange = sheet.getDataRange();
var dataValue = dataRange.getDisplayValues();
//Execute when clicked approved button.
var value = sheet.getRange(row+1,10).setValue("Approved");
var scriptLastRow = sheet.getLastRow();
for(var j=1; j<scriptLastRow; j++){
var applyLdap = sheet.getRange(j+1,3).getValue();
}
//Sheet ROTA :
var ssRota = ss.getSheetByName("ROTA");
var rotaLastRow = ssRota.getLastRow();
var getLdap = sheet.getRange(row + 1 , 3).getValue();
for(var x=11; x<sheet.getLastColumn(); x++){
//Changing col to row:
var ldapIndex = ssRota.getRange(1,4,rotaLastRow,1).getValues();//highlight ldap column
var ldapRow = ldapIndex.map(function(row){return row[0];});//changing from column to row
var ldap = ldapRow.indexOf(getLdap)+1;//find ldap
var getCol = sheet.getRange(row+1,x).getValue();//value=6,7
Logger.log(ldap);
Logger.log(getCol);
//stop execute if no value:
if(getCol === ""){
false;
}else if(getCol === 9 || getCol === 10){
ssRota.getRange(ldap,getCol).setValue("L");
}else if(getCol % 7 === 2 || getCol % 7 === 3){
ssRota.getRange(ldap,getCol).setValue("L");
}
else{
ssRota.getRange(ldap,getCol).setValue("V");
}
}
}(我的表格代码HTML )
window.onload = function (){
google.script.run.withSuccessHandler(onSuccess).getTable();
}
function onSuccess(data){
if(data.success){
//console.log(data.data);//{application array(4), success:true}&&[array(27),Array(27)]
var html = '<table>';
var row;
for(var i=0; i<data.data.length; i++){
html += '<tr>';
row = i;
console.log(row);//[0,1,2,3,]
for (var j=0; j<9; j++){
html += '<td>'+ data.data[i][j]+'</td>';
}
html += '<td>'+ '<button data-row="'+i+'" data-column="'+j+'" id="btn">Approved</button>'+'</td>';
html += '</tr>';
}
html += '</table>';
output.innerHTML = html;
//console.log(data);//{data:Array(4), success:true}
const table = document.querySelector("table");
table.addEventListener('click',approve);
}
}
function approve(e){
const td = e.target;
const [row, column] = [parseInt(td.dataset.row),parseInt(td.dataset.column)];
console.log(td);
console.log([row,column]);
google.script.run.getRow(row,column);
const table = document.querySelectorAll("button");
table[row].style.backgroundColor = "red";
}(GS代码过滤器)
function myFilter(ldap) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Query_Script");
var originalData = sheet.getRange(2,1,sheet.getLastRow(),10).getValues();
var testData = sheet.getDataRange().getDisplayValues();
var getLdap = ldap;
var dataAgent = testData.filter(function(info){return info[0] === "Email Address" || info[2] === ldap;});
return dataAgent;
}ldap.onchange = function(){
console.log(this.value);
google.script.run.withSuccessHandler(showFilter).myFilter(this.value);
}
function showFilter(dataAgent){
console.log(dataAgent);
var html = '<table>';
var row;
for(var i=0; i<dataAgent.length; i++){
html += '<tr>';
row = i;
console.log(row);//[0,1,2,3,]
for (var j=0; j<9; j++){
html += '<td>'+ dataAgent[i][j]+'</td>';
}
html += '<td>'+ '<button data-row="'+i+'" data-column="'+j+'" id="btn">Approved</button>'+'</td>';
html += '</tr>';
}
html += '</table>';
output.innerHTML = html;
const table = document.querySelector("table");
table.addEventListener('click',approve);
}发布于 2020-09-10 21:56:07
这是我的解决方案。基本上,我不是在google电子表格中过滤数据并将数据提取回Modal对话框,而是直接在模式对话框中创建新表并为每个按钮赋值。
document.addEventListener("DOMContentLoaded",function(){
google.script.run.withSuccessHandler(generateTable).getTableData();
});
function generateTable(dataArray){
dataArray.forEach(function(r){
var row = document.createElement("tr");
var col1 = document.createElement("td");
col1.textContent = r[1];
var col2 = document.createElement("td");
col2.textContent = r[2];
var col7 = document.createElement("button");
const getRow = table.rows.length;
col7.innerHTML = "Approve";
col7.setAttribute("class",getRow)
row.appendChild(col1);
row.appendChild(col2);
row.appendChild(col3);
tbody.appendChild(row);getTableData()只是从电子表格中获取数据的GS代码。然后我开始过滤它:
name.onchange = function(){
for(var i=1; i<table.rows.length; i++){
if(table.rows[i].cells[0].textContent === this.value){
console.log(table.rows[i].cells[0].textContent);
table.rows[i].style.display = "";
}else{
table.rows[i].style.display = "none";
}
}
} 因此,现在每当我过滤它并单击按钮时,该按钮都会返回行索引,并更新电子表格中的特定行。
https://stackoverflow.com/questions/63750090
复制相似问题