0

Googleシートのforループから正しい値を引き出す際に問題が発生しています。ここ は私のコードです: 注:この、元のシートを追跡し、私が最初にここに起こる持っている必要がありますどのような大きな機能Google Appsスクリプト - 条件に基づいて範囲からデータをプルするためにループを使用する

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; 
     } 
    } 
} 

Here's a copy of the sheet I'm working on

からの抜粋です、そして、にオブジェクトを作成しますreturnedValues()関数から返されたデータを保持します。後で、このオブジェクトのプロパティを電子メール送信機能と呼ぶことにします。

問題は、選択したシートからデータを動的に取り出すことができるということです(この場合、「Miranda」シート)。つまり、ユーザーが列のIで「Yes」オプションを選択すると、 Mirandaシートでは、このスクリプトが最初に行う必要があるのは、forループの先頭にある変数の値を、ユーザが「はい」を選択した同じ行内のにプルすることです。次に、そのデータを後で呼び出すカスタムオブジェクトにプッシュします。

私はそれが間違っていることは明らかです。少なくとも、私のループには何か問題があります。私が何をした?すべてのその空白が実際のスクリプトエディタで行きました

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]; 
      } 
     } 

答えて

1

::)

EDIT:ヴィータウタスでの提案を確認した後、ここでワーキングループでの私の試みは をですか? :D

.getValues()を正しく使用して、テーブル全体を配列にプルします。今あなたがする必要があるのはforループがあり、dataMir[k][8]を通り、単純にデータif dataMir[k][8] === 'Yes'をフェッチすることです。私はまた、for (var k in dataMir)を使用する必要はないと感じています。for (var k = 0; k < dataMir.length; k++)は多くのクリーナーであり、制御を保証するforループを持っています(それはおそらくもっと好みのことです)。あなたはmirData[k][0]は列Aであるかのよう

あなたはまた、配列は0から始まることを、覚えておいてください

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 

を持っていることによって、あなたが使用する変数の数を減らすことができ、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 
    } 
    } 

私がそれらの変数に追加した列があなたが望むものかどうかを再確認してください。私が理解しているように、オブジェクトには行配列全体が格納されています。列にはの管理アクションの値と列の日付/期間が入ります。。そうでない場合は、それに応じて調整してください。わかるように、データ配列全体を操作するだけで、シート自体の作業を最小限に抑えます。できるだけ少数のGoogleサービスに電話をかけてください。

+0

配列内の行オブジェクトとしてmirData [k]が8行目のすべてのセルをフェッチしているため、文字列を探すためのforループを実行すると実際のセルがプルされます。今それは理にかなっています:)ありがとう!私は今朝これを試してみると – Jensen010

+0

私はあなたがここで言っていることを実装する方法を理解していると思う(ループまで)私は上の編集でコードでトラックにいますか? – Jensen010

+0

私はこれがうまくいくと信じていますが、私を修正することは自由です。また、私は少し下に変数をカットしたいと思いますが、今すぐ外れています – Jensen010

関連する問題