2014-03-13 295 views
2

我不熟悉Google腳本。我發現了一些應該工作但沒有的東西。我搜索了,但找不到解決方案。無法讓Google腳本正常工作

我發現腳本:

function onEdit() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName("My Sheet name"); 
    var statusValues = sheet.getRange("D:D").getValues(); 
    var dateValues = sheet.getRange("E:E").getValues(); 
    for (var row in statusValues) { 
    if (statusValues[row] != "Yes" && dateValues[row] == "") { 
     var num = parseInt(row) + 1; 
     sheet.getRange(num, 17).setValue(new Date()); 
    } 
    } 
}; 

它應該自動適用於E欄的編輯日期時d細胞說Yes(在同一行)。當我調試它時,我得到:

TypeError: Cannot call method "getRange" of null. (line 5, file "Code")* 

我的D列是一個帶空白/是/無選項的下拉菜單。這可能是爲什麼?此外,它不會顯示在我的雲端硬盤中。我讀到了應該發生的地方。

回答

0

最後,很多buggering左右後從@Harold幫助,我得到了這工作。 僅供參考我有一個表格,其中E記錄D滴菜單設置爲YES的日期,如果將D更改爲其他任何東西,E中的此日期將被刪除。 的F和G

function onEdit() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName("MySheet"); // don't forget to change by your sheet name 
    var statusValues = sheet.getRange("D:E").getValues(); // performed a one time import - more efficient 
    var statusValues2 = sheet.getRange("F:G").getValues(); 


    for (var row in statusValues) { 
    if (statusValues[row][0] == "Yes" && statusValues[row][1] == "") { 
     var num = parseInt(row) + 1; 
     sheet.getRange(num, 5).setValue(new Date()); // "5" is the column where the date is wrote 
    } 
     if (statusValues[row][0] != "Yes" && statusValues[row][1] != "Date") { 
     var num = parseInt(row) + 1; 
     sheet.getRange(num, 5).setValue(""); // "5" is the column where the date is wrote 
    } 
    } 

    for (var row in statusValues2) { 
    if (statusValues2[row][0] == "Yes" && statusValues2[row][1] == "") { 
     var num = parseInt(row) + 1; 
     sheet.getRange(num, 7).setValue(new Date()); 
    } 
     if (statusValues2[row][0] != "Yes" && statusValues2[row][1] != "Date") { 
     var num = parseInt(row) + 1; 
     sheet.getRange(num, 7).setValue(""); 
    } 
    } 
}; 

任何建議相同的運行,以簡化這個仍然歡迎。

1

試試這個代碼:
不要忘記更改「我的工作表名稱」爲您的工作表名稱

function onEdit() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getSheetByName("My Sheet name"); // don't forget to change by your sheet name 
    var statusValues = sheet.getRange("D:E").getValues(); // performed a one time import - more efficient 
    for (var row in statusValues) { 
    if (statusValues[row][0] == "Yes" && statusValues[row][1] == "") { 
     var num = parseInt(row) + 1; 
     sheet.getRange(num, 5).setValue(new Date()); // "5" is the column where the date is wrote 
    } 
    } 
}; 
+0

感謝Harold,但仍然給出同樣的錯誤: –

+0

@ user3413227不要忘記更改工作表的名稱或更改代碼中的引用。這裏是一個演示:https://docs.google.com/spreadsheets/d/1VppbEvBH5X-Qk2bT0DalBGYZ3c7P1CHz9w7K5bwFpzU/edit?usp=sharing – Harold

+0

謝謝@Harold。我無意中混淆了工作表名稱和文檔名稱,所以請帶我一邊......:|我還補充: if(statusValues [row] [0]!=「是」){ var num = parseInt(row)+ 1; sheet.getRange(num,5).setValue(「」); //「5」是日期寫入的列 } 但它也會清除我的標題(第3行)。有沒有辦法將這個清理結果應用到第4-20行? –

2

不知道你是否已經解決了所有問題,但我想我會分享我的解決方案。

我們的團隊有多個電子表格,記錄最後一個用戶要編輯的行和該行最後兩列的編輯日期。

首先我有一個masterOnEdit(E)的功能,看起來像這樣:

function masterOnEdit(e) { 

    // Get active spreadsheet and row information 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var row = e.source.getActiveCell().getRow(); 
    var col = e.source.getActiveCell().getColumn(); 

    // Set last updated and user cells if not editing those cells 
    if (row > 3 && col < (sheet.getLastColumn()-2)) { 
    setLastUpdated(sheet); 
    } 
} 

此功能將忽略前三行(標題行對我來說),而忽略編輯的最後兩列(如果你想手動添加一個用戶/日期)。

該函數還調用一個名爲setLastUpdated(sheet)的函數。請注意,我將表單變量傳遞給此子函數以限制Google API調用。真正的編輯發生在這裏:

function setLastUpdated(sheet){ 
    var row = sheet.getActiveCell().getRow(); 
    var email = Session.getActiveUser().getEmail(); 
    var user = parseUser(email); 
    var userCell = sheet.getRange(row, sheet.getLastColumn()-1) 
    userCell.setValue(user.name); 
    userCell.setBackground(user.color); 

    var date = Utilities.formatDate(new Date(), "GMT-5", "h:mm a M/d/yy"); 
    sheet.getRange(row, sheet.getLastColumn()).setValue(date); 
} 

此代碼塊中的另一個子功能解析出用戶名。該函數接收由google返回的電子郵件並使用正則表達式將其解析爲我們的團隊名稱。這也允許我根據哪個團隊成員進行編輯來設置用戶單元格的顏色。

function parseUser(email) { 
    var user = {name: email, color:'#FFFFFF'} 
    if (/peter/.test(email)){ 
    user.name = 'Peter'; 
    user.color = '#4585F1'; 
    } 
} 

希望這會有所幫助。我基於我在網上找到的一些最完整的例子來構建它。真正幫助我們的團隊跟蹤誰在處理電子表格工作流程。