2016-12-05 11 views
0

私はスクリプト作成の初心者で、現在Spreadsheetで指定された数値に基づいて電子メールを送信する自動電子メール送信システムを完成しようとしています。指定された送信日)。Googleスクリプト:スプレッドシートからの列と行のクロスマッチング

スプレッドシートから数値(左の桁)を参照することで、列の保持数と指定した数値とを一致させることで列を指定することができました。 (この場合、「7」であった)。

その後、最初に指定した列番号から先に指定した列から行番号またはデータ番号を取得し、列内の行を調べて目的のデータを見つけるために "for"を使用します。私はそれを動作するように管理することができますが、それは超スロー処理

(この場合は「1」)... は、私はすでにしばらくのためのソリューションを探しているが、方法を考え出すことができませんでした。

解決策のアイデアを共有していただければ大変感謝しています。 私が試したスクリプトは以下の通りです。スタート使用CaldatRange.getValuesとして

function AutoSend() {  
     // Get the spreadsheet 
     var book = SpreadsheetApp.getActiveSpreadsheet(); 

     // Get cal  
     var Calsheet = book.getSheetByName("cal"); 

     //=========================================================//  
     // Get data range that contains data  
     var CaldatRange = Calsheet.getDataRange(); 

     //=========================================================//  
     // Get the row number of Cal to process  
     var CalnumRows = CaldatRange.getNumRows(); 

     // Get the column number of Cal to process  
     var CalnumCols = CaldatRange.getNumColumns(); 

     //=========================================================//   
     // Get the number of column to start to process 
     var Cstart = Calsheet.getRange(6, 5).getValue(); 

    //=========================================================//  

var coldata = []; 

var rowdata = []; 

for (var j = Cstart;j <= CalnumCols;j++){ 

var colnumfind = Calsheet.getRange(6, j).getColumn(); 

var status  = Calsheet.getRange(3, j).getValue(); 

var dayLeft = Calsheet.getRange(4, j).getValue(); 

var Sdate  = Calsheet.getRange(5, j).getValue(); 

    if(dayLeft == "7" && status == "未送信") 
    { 
     Browser.msgBox("確認",colnumfind, Browser.Buttons.OK); 
     coldata = colnumfind; 
     for (var i = 6; i <= CalnumRows; i++) 
     { 
     var sendOK  = Calsheet.getRange(i,coldata).getValue(); 
     var rownumfind = Calsheet.getRange(i, coldata).getRow(); 

     if(sendOK == "1") 
     { 
      rowdata = rownumfind; 
      var email = Calsheet.getRange(rowdata,3).getValue(); 
      Browser.msgBox("確認","found it : Row " + rowdata +", Column "+ coldata + " " + email, Browser.Buttons.OK); 
      //PUT SEND EMAIL FUNCTION 
     } 

     } 
     Calsheet.getRange(3,coldata).setValue("送信済"); 
    } 
    } 
} 
+0

明確にするには、C3の中にある列を定義します。あなたは、列がいくつの行を見つけ出して何かを抽出したいのですか?現在の設定では、getValueをたくさん呼び出しています。あなたの究極の目標は何ですか?私はこれがより簡単に達成できると感じています。 –

+0

ご意見ありがとうございます。 究極の目標は、Gmailを使って自動メーリングを作成することです。 頻繁にイベントを開くので、Googleフォームを使用してアプリケーションを収集し、スプレッドシートに保存することに決めました。 –

+0

そして、私たちは7日前にそれらを思い出させるために自動的に電子メールを送信します。 私が問題を抱えているコーディングは、何日残ったかに基づくこのアラームシステムです。 何らかの理由で、私が持っていた問題を解決して、今度は2番目の "for"を読むことに成功しましたが、この単純な方法を処理するのに時間がかかります... ここに更新されたスクリプトを投稿できますか? –

答えて

0

()、ここでは一例です:

var values = CaldatRange.getValues(); 

for (var j = Cstart-1;j < CalnumCols;j++){ 
var status  = values[2][j]; 
var dayLeft = values[3][j]; 
var Sdate  = values[4][j]; 
var colnumfind = j+1; 

またこれらを変更することができます。

var sendOK  = values[i-1,coldata] 
var rownumfind = i; 

var email = values[i-1,2]; 

これは、すべてあなたのgetValueの呼び出しを排除します。

+0

あなたのソリューションutfxをありがとう! これは処理時間を大幅に短縮しました! しかし、私は望ましい行を検出することに別の問題があります。 ''(dayLeft == "7" && status == "未送信") ' までは正しい列(この場合は" 7 "を含む)が読み取られますが、 ' var sendOK = values [i -1、coldata] ' それは私に間違った列を与えます(それは72日でした)ので、それは読んでいたはずの行を読みません。 ここで何が問題になるのですか? –

+0

は1行オフですか?次のようにしてください:for(var i = 5; i <= CalnumRows; i ++) – utphx

関連する問題