Javascript 谷歌应用程序脚本-使用for循环根据条件从范围中提取数据

Javascript 谷歌应用程序脚本-使用for循环根据条件从范围中提取数据,javascript,for-loop,google-apps-script,google-sheets,conditional,Javascript,For Loop,Google Apps Script,Google Sheets,Conditional,我在Google表单中从for循环中提取正确的值时遇到了一个问题。 这是我的密码: 注意:这是一个较大函数的片段 function sendEmails() { var trackOriginSheet = SpreadsheetApp.getActiveSpreadsheet().getName(); var getMirSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Miranda"); //Set a new o

我在Google表单中从for循环中提取正确的值时遇到了一个问题。 这是我的密码: 注意:这是一个较大函数的片段

function sendEmails() {
var trackOriginSheet = SpreadsheetApp.getActiveSpreadsheet().getName();
var getMirSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Miranda");

//Set a new object to hold conditional data
var holdingData = new Object();

//Create function to get values from origin sheet
var returnedValues = function (trackOriginSheet) {

//Load dynamic variables into an object via returnedValues()
    if (trackOriginSheet === getMirSheet) {

        var startMirRow = 2; // First row of data to process
        var numRowsMir = 506; // Number of rows to process

        // Fetch the range of cells A2:Z506
        var dataRangeMir = getMirSheet.getRange(startMirRow, 1, numRowsMir, 26);

        // Fetch values for each cell in the Range.
        var dataMir = dataRangeMir.getValues();

        for (var k in dataMir) {
            var secondRowMir = dataMir[k];
            var intRefDescMir = secondRowMir[3];
            var intAdminActionsMir = secondRowMir[4];

            //Push returned data to holdingData Object
            holdingData.selectedData = secondRowMir;
            holdingData.refDesc = intRefDescMir;
            holdingData.adminActions = intAdminActionsMir;
        }
    }
}

首先,我需要跟踪原始工作表,然后创建一个对象来保存从returnedValues()函数返回的数据。稍后,我将把这个对象的属性调用到发送电子邮件函数中

问题是,我需要能够动态地从所选工作表(本例中为“Miranda”工作表)中提取数据。换句话说,当用户在Miranda工作表的第I列中选择“是”选项时,这个脚本需要做的第一件事是在用户选择“是”的同一行中提取for循环顶部的变量值。然后,我将该数据推送到一个自定义对象,以便稍后调用

很明显,我做错了。至少我的循环有点问题。我做了什么?:)

编辑: 在回顾了VyTautas的建议之后,下面是我对工作循环的尝试:

for (var k = 0; k < dataMir.length; k++) {
            var mirColI = dataMir[k][8];
            var mirRefDesc = dataMir[k][2];
            var mirAdminActions = dataMir[k][3];
            var mirDates = dataMir[k][4];
            if (mirColI === "Yes") {
              var activeRowMir = mirColI.getActiveSelection.getRowIndex();
              //Pull selected values from the active row when Yes is selected
              var mirRefDescRange = getMirSheet.getRange(activeRowMir, mirRefDesc);
              var mirRefDescValues = mirRefDescRange.getValues();
              var mirAdminActionsRange = getMirSheet.getRange(activeRowMir, mirAdminActions);
              var mirAdminActionsValues = mirAdminActionsRange.getValues();
              var mirDatesRange = getMirSheet.getRange(activeRowMir, mirDates);
              var mirDatesValues = mirAdminActionsRange.getValues();
              var mirHoldingArray = [mirRefDescValues, mirAdminActionsValues, mirDatesValues];
              //Push mirHoldingArray values to holdingData
              holdingData.refDesc = mirHoldingArray[0];
              holdingData.adminActions = mirHoldingArray[1];
              holdingData.dates = mirHoldingArray[2];
            }
        }
for(var k=0;k
在实际的脚本编辑器中,所有的空白都到哪里去了D

您已经正确地使用
.getValues()
将整个表拉入数组。您现在需要做的是使用for循环遍历
dataMir[k][8]
,如果dataMir[k][8]==“Yes”,只需获取数据
。我还觉得没有必要使用
for(dataMir中的var k)
因为
for(var k=0;k
要干净得多,而且您有一个for循环来保证控制(尽管这可能更像是一个首选项)

您还可以通过使用

holdingData.selectedData = mirData[k]
holdingData.refDesc = mirData[k][2] //I assume you want the 3rd column for this variable, not the 4th
holdingData.adminActions = mirData[k][3] //same as above
请记住,数组以0开头,因此如果
mirData[k][0]
是列A,
mirData[k][1]
是列B,依此类推

编辑:您在编辑中所写的内容似乎是在代码上加倍。您已经有了数据,但是您正在尝试再次提取它,您使用的一些变量应该会给您一个错误。我将从if中删除代码,尽管我不明白为什么需要同时获取活动工作表和按名称获取工作表。如果您知道名称是常量,那么只需始终按名称(或索引)获取正确的工作表,从而消除使用错误工作表的可能性

   var titleMirRows = 1; // First row of data to process
   var numRowsMir = getMirSheet.getLastRow(); // Number of rows to process

// Fetch the range of cells A2:Z506
   var dataRangeMir = getMirSheet.getRange(titleMirRows + 1, 1, numRowsMir - titleMirRows, 26); // might need adjusting but now it will only get as many rows as there is data, you can do the same for columns too

// Fetch values for each cell in the Range.
   var dataMir = dataRangeMir.getValues();

   for (var k = 0; k < dataMir.length; k++) {
     if (dataMir[k][7] === 'Yes') {    //I assume you meant column i
       holdingData.refDesc = dataMir[k] //this will store the entire row
       holdingData.adminActions = dataMir[k][3] //this stores column D
       holdingData.dates = dataMir[k][4] //stores column E
     }
   }
var titleMirRows=1;//要处理的第一行数据
var numRowsMir=getMirSheet.getLastRow();//要处理的行数
//获取单元格A2:Z506的范围
var dataRangeMir=getMirSheet.getRange(titleMirRows+1,1,numRowsMir-titleMirRows,26);//可能需要调整,但现在它将只获得与数据相同的行数,您也可以对列执行相同的操作
//获取范围内每个单元格的值。
var dataMir=dataRangeMir.getValues();
对于(var k=0;k

仔细检查我添加到这些变量中的列是否符合您的要求。据我所知,该对象存储整个行数组、名为Administrative Actions的列中的值以及日期/期间(如果适用)列中的值。如果没有,请进行相应的调整,但正如您所看到的,我们通过简单地操作整个数据数组来最小化对工作表本身所做的工作。始终尽可能少地调用Google服务。

因为mirData[k]正在获取第8行中的每个单元格,作为数组中的行对象,并在其中运行for循环以查找字符串,这将提取实际单元格。现在有道理了:)谢谢!今天早上我会尝试一下,然后回来汇报我想我理解了如何实现你在这里所说的(就循环而言)我在上面的编辑中的代码是否正常?用我的一天结束时的认识编辑:)我相信这会起作用,但请随时纠正我。另外,我想把变量减少一点,但是我没时间了,对吗now@Jensen010请查看我对答案的编辑。查看您的
for
循环,如果没有其他更改,那么您将重复执行相同的操作两次。您已经有了
dataMir
,它应该是您想要的所有数据,您想要对该工作表执行的唯一其他调用是如果您更改了其中的任何内容。我还更改了
numRowsMir
,以便您只获取所需的数据。这对我现在来说是有意义的。我不知道为什么我没有想到只选择一个单元格值b