1

我所做的:電子郵件通知,如果特定的細胞發生變化,另一個細胞值添加到消息,而無需更改跟蹤

如果M列任意單元格已被更改,那麼電子郵件通知已sended指定從N列ADRES在同一行。但我也需要從同一行的其他列指定正文文本。我做了一些工作,但也導致如果其他已聲明的列(例如項目,客戶,任務,執行者)已被更改,emil已發送到。

我需要的:

只是跟蹤只有一個「M」列的變化和從其他列電子郵件附加數據的身體,但來自同一行放。和(那點)沒有跟蹤其他列變化,電子郵件應該僅更改列M.

也許會很容易,但我扭...

我bulid這個劇本送基於:

我的腳本:

function sendNotification() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getActiveSheet(); 
    var cell = ss.getActiveCell().getA1Notation(); 
    var row = sheet.getActiveRange().getRow(); 
    var cellvalue = ss.getActiveCell().getValue().toString(); 
    var sendto = ''; 
     if(cell.indexOf('M')!=-1){ 
     sendto = sheet.getRange('N'+ sheet.getActiveCell().getRowIndex()).getValue() 
     } 
    var project = ''; 
     project = sheet.getRange('C'+ sheet.getActiveCell().getRowIndex()).getValue() 
    var customer = ''; 
     customer = sheet.getRange('D'+ sheet.getActiveCell().getRowIndex()).getValue()  
    var task = ''; 
     task = sheet.getRange('E'+ sheet.getActiveCell().getRowIndex()).getValue()  
    var executor = ''; 
     executor = sheet.getRange('F'+ sheet.getActiveCell().getRowIndex()).getValue() 
    var deadline = ''; 
     deadline = LanguageApp.translate(Utilities.formatDate(sheet.getRange('I'+ sheet.getActiveCell().getRowIndex()).getValue() , "GMT" , "EEEE, dd MMMM YYYY"),'en','pl') 
    var status = ''; 
     status = sheet.getRange('M'+ sheet.getActiveCell().getRowIndex()).getValue()   
    var mysubject = status + ' | ' + project + ': ' + task + ' - ' + ss.getName() + ' update'; 
    var mybody = '\nStatus: ' + status + '\n\nproject: ' + project + '\ncustomer: ' + customer + '\ntask: ' + task + '\nexecutor: ' + executor + '\nDeadline: ' + deadline + '\n\n' + ss.getName() + ': \n' + ss.getUrl(); 

    MailApp.sendEmail({ 
    to:sendto, 
    subject:mysubject, 
    body:mybody}); 
}; 
+0

那麼,這有幫助嗎? – 2014-09-23 21:29:18

+0

不幸的是,這不是我所需要的,我需要尋找另一種解決方案......但是感謝您提供的時間和可能的解決方案。問題是我有很多行,而且我需要在很少人的同時快速工作。 – akx 2014-10-06 12:23:02

+0

讓我的答案不被選中意味着你希望未來的讀者知道我的答案是錯誤的。檢查我的答案是否正確意味着未來的讀者可以從中受益,即使它沒有完全解決您的問題。此外,「贊成票」意味着您受益於或以其他方式讚賞提供的幫助。 – 2014-10-06 22:56:00

回答

0

我做了一個示例腳本,你應該能夠在https://docs.google.com/spreadsheets/d/11u0xkdtPlQsnVppCnPYM0CHuCTPLdmN8PcFlaW08lNw/edit#gid=0

看到你必須做一個副本居然用它做什麼。

...複製不會給你我設置的觸發器。如果您編輯腳本,請轉到菜單資源當前項目的觸發器並使您自己成爲函數的基於時間的觸發器checkForChanges()。我爲了測試目的將其設置爲「每分鐘」。

要將列我增加了四個新:

  • CONCAT - 簡直是所有行的值,它們的變化,你需要監視
  • 現散列的串聯 - 從生成簡單的功能,我添加到您的腳本
  • 最後編輯 - 在發送電子郵件後腳本給這個單元格的值當前散列
  • 改變 - 比較最後編輯現散列並說**真實*如果它們是不同的。

所以...週期性的功能checkForChanges()在範圍內運行ChangeDetector正在尋找true。如果它沒有發現它立即退出。

每次找到更改時,它都會收集該行的數據並通過電子郵件發送。 (其實,我只是記錄它,爲簡單起見。)

的關鍵訣竅是對線:

lastEdits[row_][0] = currentHashCodes[row_][0]; 
    ss_.getRangeByName("LastEdit").setValues(lastEdits); 

注意你的代碼是如何清楚,如果你用命名範圍在以往任何時候可能。

下面是情況下,例如獲取在未來某一天失去代碼:

/* Called from cells in column "Current Hash" */ 
function strHash(valCell) { 
    var hash = 0; 
    if (valCell.length == 0) return hash; 
    for (i = 0; i < valCell.length; i++) { 
    char = valCell.charCodeAt(i); 
    hash = ((hash<<5)-hash)+char; 
    hash = hash & hash; // Convert to 32bit integer 
    } 

    return hash; 
} 


/* Called periodically from a timed trigger. */ 
function checkForChanges() { 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var changeDetector = ss.getRangeByName("ChangeDetector").getValues(); 
    for (row in changeDetector) { 
    if (row > 0) { 
     changed = changeDetector[row][0]; 
     if (changed) notify(ss, row); 
    } 
    } 

} 


/* Called by checkForChanges(). */ 
function notify(ss_, row_) { 

    initializeRangeArrays(ss_); 

    status = statii[row_][0]; 
    project = projects[row_][0]; 
    task = tasks[row_][0]; 
    customer = customers[row_][0]; 
    executor = executors[row_][0]; 
    deadline = deadlines[row_][0]; 
    sendto = recipients[row_][0]; 

    var mysubject = status + ' | ' + project + ': ' + task + ' - ' + ss_.getName() + ' update'; 
    var mybody = '\nStatus: ' + status 
      + '\n\nproject: ' + project 
      + '\ncustomer: ' + customer 
      + '\ntask: ' + task 
      + '\nexecutor: ' + executor 
      + '\nDeadline: ' + deadline 
      + '\n\n' + ss_.getName() 
      + ': \n' + ss_.getUrl(); 

    Logger.log("to: " + sendto); 
    Logger.log("subject: " + mysubject); 
    Logger.log("body: " + mybody); 
    Logger.log(""); 

    lastEdits[row_][0] = currentHashCodes[row_][0]; 
    ss_.getRangeByName("LastEdit").setValues(lastEdits); 

}; 


var recipients = null; 
var projects = null; 
var customers = null; 
var tasks = null; 
var deadlines = null; 
var executors = null; 
var statii = null; 
var lastEdits = null; 
var currentHashCodes = null; 

var rangeArraysInitialized = false; 
/* Called by notify(). */ 
function initializeRangeArrays(ss_) { 

    if ( ! rangeArraysInitialized ) { 
    recipients = ss_.getRangeByName("Recipient").getValues(); 
    projects = ss_.getRangeByName("Project").getValues(); 
    customers = ss_.getRangeByName("Customer").getValues(); 
    tasks = ss_.getRangeByName("Task").getValues(); 
    deadlines = ss_.getRangeByName("Date").getValues(); 
    statii = ss_.getRangeByName("Status").getValues(); 
    executors = ss_.getRangeByName("Executor").getValues(); 
    lastEdits = ss_.getRangeByName("LastEdit").getValues(); 
    currentHashCodes = ss_.getRangeByName("CurrentHash").getValues(); 

    rangeArraysInitialized = false; 
    } 
} 

更新2014年9月22日:

我已在演示電子表格的一些變化。請看一看。

到我添加的腳本。 。 。

function strArrayHash(range) { 
    var ret = new Array(); 
    var str = ""; 
    for (item in range) { 
    str = range[item].toString(); 
    if (str.length > 0) { 
     ret[item] = strHash(str); 
     Utilities.sleep(50);  // play with this to reduce "internal execution error"s 
    } else { 
     ret[item] = ""; 
    } 
    }; 
    return ret; 
} 

在列「P」中,我替換了。 。 。

=if(M2 = "", "", strHash(R2))) 
=if(M3 = "", "", strHash(R3))) 
     : 
     : 
=if(M22 = "", "", strHash(R22))) 

。 。 。與。 。 。

=ARRAYFORMULA(if(M2:M514 = "", "", strArrayHash(R2:R514))) 

。 。 。在單元格「P2」只有。我還刪除在範圍內的所有單元格的內容「P3:P22」

予增加的行的總數1026

一旦值出現在柱P,我複製細胞P2:P1026成M2 :M1026使用[選擇性粘貼]»[僅粘貼數值]。

在我的i7處理器的筆記本電腦用了它30秒重計算和檢測線500

的變化,我得到一個內部執行錯誤,如果我嘗試做所有的1024線。

可能您需要將「if」子句複雜化,以便僅對真正需要的行進行散列計算。

更新:: 2017/02/24沒有人對此感興趣,所以我停止了運行該腳本的觸發器。

+0

Thx回答。但我注意到了兩件事: - 腳本沒有那麼快(如果我改變第1行的腳本腳本正在慢慢檢查所有其他行的更改...), - 某處大約300+行(是,我的文檔就是那麼大,約500行)我有一個錯誤:「錯誤:腳本每秒爲此Google用戶帳戶調用的次數太多。」 – akx 2014-09-22 07:56:52

+0

請參閱我的更新 – 2014-09-22 12:54:05