Google apps script 将按钮上的单元格值更改为基于条件的列值
我想通过单击按钮(D3)来更改单元格G2中的值。循环通过的(A列)值应符合B列中的标准“是” 试试这个:Google apps script 将按钮上的单元格值更改为基于条件的列值,google-apps-script,google-sheets,google-sheets-macros,Google Apps Script,Google Sheets,Google Sheets Macros,我想通过单击按钮(D3)来更改单元格G2中的值。循环通过的(A列)值应符合B列中的标准“是” 试试这个: function makingChange() { var ss=SpreadsheetApp.getActive(); var sh=ss.getSheetByName('Sheet1'); var rg=sh.getRange(2,1,sh.getLastRow()-1,2); var vA=rg.getValues(); var rg2=sh.getRange('G
function makingChange() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('Sheet1');
var rg=sh.getRange(2,1,sh.getLastRow()-1,2);
var vA=rg.getValues();
var rg2=sh.getRange('G2');
var vg2=rg2.getValue();
var rgi=sh.getRange('H2');
var vi=rgi.getValue();
var sObj={nA:[]};
var startIdx=!vi?0:vi;
if(startIdx>=(vA.length-1))startIdx=0;
for(var i=startIdx;i<vA.length;i++) {
if(!vg2 && vA[i][1].toString().toLowerCase()=='yes'){
rg2.setValue(vA[i][0]);
sh.getRange(i+2,1).activate();
sh.getRange('H2').setValue(i);
break
}
if(vg2 && vA[i][1].toString().toLowerCase()=='yes' && vA[i][0]!=vg2) {
rg2.setValue(vA[i][0]);
sh.getRange(i+2,1).activate();
rgi.setValue(i);
break;
}
if(vg2 && vA[i][1].toString().toLowerCase()=='no' && i==vA.length-1) {
rg2.setValue('');
rgi.setValue('');
makingChange();//Thats right this runs the script over again
}
}
}
函数生成更改(){
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('Sheet1');
var rg=sh.getRange(2,1,sh.getLastRow()-1,2);
var vA=rg.getValues();
var rg2=sh.getRange('G2');
var vg2=rg2.getValue();
var rgi=sh.getRange('H2');
var vi=rgi.getValue();
var sObj={nA:[]};
var startIdx=!vi?0:vi;
如果(startIdx>=(vA.length-1))startIdx=0;
对于(var i=startIdx;i,OP的目标是循环遍历在每个名称上停止的名称列表,值为“yes”
显然,这需要跳过值为“否”的名称。在处理列表中的姓氏以及“选择”值为“否”的名称时,存在一个特殊的挑战。在这种情况下,循环应该在列表顶部“重新启动”
以下代码针对这些意外事件中的每一个
使用下面所示的示例数据;代码应该停止在Paul、Dave、Brett和Ted上。
如果单元格G2中的值为“Ted”,则下一个选定名称应为Paul
样本数据屏幕截图
功能so5794149403(){
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('57941494');
var rg=sh.getRange(2,1,sh.getLastRow()-1,2);
var vA=rg.getValues();
var vAnum=vA.长度;
var name=sh.getRange(2,1,sh.getLastRow()-1,1).getValues();
//展平阵列
var users=names.map(函数(行){返回行[0];});
//设置一些变量
var i=0;
var failedNTLN=0;//失败,但不是姓氏
var modifiedTLN=0;//失败,但姓
//循环浏览名称
对于(i;iAn)这个有趣的问题。你到底有什么问题?谢谢Cooper,这个循环很好,但有趣的是,当我将行添加到范围中时,这些行不会添加到循环中。它会在第二列的第一个“是”之后停止,并且名称不在G2
中。你希望它做什么?好的名称(及其选择标签)将被添加到列表中。这些添加的名称应该包含在循环中。我认为getLastRow
会使范围变得动态,但它不会。太好了,谢谢你让我对谷歌应用程序脚本和你的时间有了更深入的了解!@PDE解决重复名称的mod是一个值得使用的功能,我的回答中没有提到。但是。。.在我们的两个答案中,如果姓氏与第三个姓氏相同,并且都有value=“yes”,而第二个姓氏与这两个姓氏中的任何一个都不相同,并且值为no,那么代码永远不会超过第三个姓氏。解决这一复杂编程难题的方法非常简单——“没有重复的姓氏”。例如,将“Ted”更改为“Ted B1”和“Ted B2”。这!说明了我的意思。@PDE老实说,这是一个组合。花了一段时间,才发现代码需要测试“下一个名称”和“当前名称”是否会通过逻辑测试。这就带来了管理“姓氏”(modifiedTLN
)以及“紧挨着姓氏”(failedNTLN
)。我相信,一个更有经验的编码员可以让这更优雅(和高效?)。但正如他们所说,“完美是好的敌人”。
function makeDialog() {
var html='<input type="button" value="Run" onClick="google.script.run.makingChange();" />';
var userInterface=HtmlService.createHtmlOutput(html);
SpreadsheetApp.getUi().showSidebar(userInterface);
};
function so5794149403() {
var ss=SpreadsheetApp.getActive();
var sh=ss.getSheetByName('57941494');
var rg=sh.getRange(2,1,sh.getLastRow()-1,2);
var vA=rg.getValues();
var vAnum = vA.length;
var names = sh.getRange(2,1,sh.getLastRow()-1,1).getValues();
//flatten the array
var users = names.map(function (row) { return row[0]; });
// set some variables
var i=0;
var failedNTLN = 0; // fail but Not The Last Name
var modifiedTLN = 0;// fail but The Last Name
//Loop through names
for (i;i<names.length;i++){
//Logger.log("DEBUG:0:i = "+i+" and failedNTLN = "+failedNTLN+" and modifiedTLN = "+modifiedTLN);
if (failedNTLN ==99){
// if last name was a failure AND it was not the Last name, then do nothing
}
else {
// get the name in Cell G2
var g2=sh.getRange("G2").getValue();
// Logger.log("DEBUG:1 currently selected name = "+g2);
// get the position of G2 in the list of names
var Pos = users.indexOf(g2);
// Logger.log("DEBUG:1 position = "+Pos);
if (modifiedTLN == 99){
// if last name was a failure AND it was The Last Name
i=0;
Logger.log("DEBUG:1: modifiedTLN is "+modifiedTLN+", and i = "+i);
}
else{
// test if this is the last name in the list
if (Pos+1 == names.length){
// this is the last name
i=0;
failedNTLN = 0;
modifiedTLN = 0;
Logger.log("DEBUG:1: Pos is last position. i = "+i)
}
else
{
// this is not the last name
i = Pos+1;
// Logger.log("DEBUG:1: Pos is NOT the last position. set i = "+i)
}
}
}
// Logger.log("DEBUG:1: settings are: i="+i+", next status = "+vA[i][1].toString().toLowerCase()+", next name = "+vA[i][0]+", g2 = "+g2);
// logic statement if status = yes, and name isn't = G2
if(vA[i][1].toString().toLowerCase()=='yes' && vA[i][0]!=g2) {
// Logger.log("DEBUG:2: IF - outcome success: i="+i+", status = "+vA[i][1].toString().toLowerCase()+", name = "+vA[i][0]+" does not equal "+g2);
sh.getRange("G2").setValue(vA[i][0]);
// Logger.log("DEBUG:2: setting G2 to "+vA[i][0]+", i = "+i+" and break")
failedNTLN=0;modifiedTLN=0;
break;
}
else if (users.indexOf(vA[i][0]) == (names.length-1)){
// the next name is the last name
// Logger.log("DEBUG:3: the next name is the last name");
modifiedTLN = 99;
failedNTLN=0;
i=0;
// Logger.log("DEBUG:3: position = "+users.indexOf(vA[i][0]))
// Logger.log("DEBUG:3: the next name: "+users.indexOf(vA[i][0])+" is the last name; i = "+i+"; set modifiedTLN to "+modifiedTLN+"; set failedNTLN to "+failedNTLN);
}
else{
// the next name is NOT the last name
failedNTLN = 99;
modifiedTLN = 0;
//Logger.log("DEBUG:4: the next name: "+users.indexOf(vA[i][0])+" is NOT the last name; i = "+i+"; set failedNTLN to "+failedNTLN+"; set modifiedTLN to "+modifiedTLN);
}
}
}