Google apps script 将按钮上的单元格值更改为基于条件的列值

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

我想通过单击按钮(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('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);
    }
  }
}