2016-12-05 37 views
0

我是腳本編程的初學者,目前正試圖在Google腳本上完成一個自動電子郵件發送系統,該系統根據Spreadsheet給出的號碼發送電子郵件指定發送日期)。谷歌腳本:電子表格中列和行的交叉匹配

通過引用電子表格中的數字(左邊的日期),我可以設法通過匹配列和指定的列的數字來指定列。 (在這種情況下是「7」)。

之後,我想從前面指定的列中獲取行或數據的數量,首先引用先前的列編號,並使用「for」查看列中的行以查找所需的數據。 (「1」這種情況下)

我會設法解決它,但它處理超慢... 我一直在尋找的同時已經解決,但無法弄清楚的方式。

因此,如果您與我分享解決方案的任何想法,我將非常感激。 我嘗試的腳本如下。

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天提醒他們。 所以我遇到問題的編碼是基於剩餘多少天的這個提醒系統。 出於某種原因,我設法解決了我有的問題,現在它讀取第二個「for」,但處理這個簡單方法需要很長時間... 如何在此處發佈更新的腳本? –

回答

0

作爲一個開始使用CaldatRange.getValues(),這裏有一個例子:

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

謝謝你的解決方案utphx! 這極大地縮短了處理時間! 但是,我發現了另一個需要檢測的行。 直到'if(dayLeft ==「7」&& status ==「未送信」)' 它讀取正確的列(在這種情況下包含「7」的第76個),但是當它讀取 'var sendOK = values [i -1,coldata]' 它給了我錯誤的列(它是第72次),所以它不讀它應該讀取的行。 這裏會有什麼問題? –

+0

是1排嗎?然後試試這個:for(var i = 5; i <= CalnumRows; i ++) – utphx

相關問題