2014-07-17 5 views
1

Я работаю с листом Документов Google, который многие люди будут иметь доступ к редактированию. Мне нужно указать, когда изменяются листы, т. Е. Добавлены или удалены строки или столбцы. Я могу получить событие onChange, когда это происходит, но я не могу найти, какой лист был изменен. Событие содержит ссылку на SpreadSheet object, но getActiveSheet всегда возвращает первый лист независимо от того, какой лист был активным.Таблицы документов Google onChange() - определить, какой лист был изменен

Я создал новую таблицу с тремя листами, добавил следующий скрипт и разрешил его.

function onOpen() { 
    ScriptApp.newTrigger("onChange") 
    .forSpreadsheet(SpreadsheetApp.getActiveSpreadsheet()) 
    .onChange() 
    .create(); 
} 
function onChange(e) { 
    Logger.log(e) 
    Logger.log("Name: " + e.source.getName()) 
    Logger.log("Active Sheet: " + e.source.getActiveSheet().getName()) 
    Logger.log("All Sheets: " + e.source.getSheets().map(function(s){return s.getName()})) 
} 

Я отправился на Лист 2 и удалил колонку. Журнал показал:

[14-07-17 19:13:32:774 EDT] {changeType=REMOVE_COLUMN, source=Spreadsheet, authMode=FULL} 
[14-07-17 19:13:32:861 EDT] Name: Untitled spreadsheet 
[14-07-17 19:13:32:944 EDT] Active Sheet: Sheet1 
[14-07-17 19:13:32:946 EDT] All Sheets: Sheet1,Sheet2,Sheet3 

Так событие, хотя у меня был лист 2 активная и операция влияет только лист 2, событие передается в обработчик OnChange, кажется, указывает, что лист 1 был активен в то время.

Как узнать, какой лист был действительно изменен?

ответ

1

Похоже, что событие изменения isn't supposed to return 'source', хотя оно и есть в журналах.

У меня такое же поведение, как и вы. Я могу получить имя листа с «on edit», но это не подходит для того, что вы пытаетесь сделать.

Я также попытался использовать комбинацию onedit и переключателей onchange, но они не будут срабатывать одновременно, только один или другой.

This is worth submitting on the issue tracker

+1

Оказывается, есть несколько вопросов, там уже: [4033] (https://code.google.com/p/google-apps-script-issues/issues/detail?id=4033), [3926] (https://code.google.com/p/google-apps-script-issues/issues/detail?id=3926&q=onChange&colspec=Stars%20Opened%20ID%20Type%20Status%20Summary%20Component% 20Owner), [3269] (https://code.google.com/p/google-apps-script-issues/issues/detail?id=3269&q=onChange&colspec=Stars%20Opened%20ID%20Type%20Status%20Summary%20Component % 20Owner) – Joe

+1

@joe - вопрос, ближайший к вашему, - [Issue 2751] (https://code.google.com/p/google-apps-script-issues/issues/detail?id=2751), и это также самый популярный из открытых, поэтому, скорее всего, привлечет внимание. Тот факт, что вы можете получить «источник», заставляет меня подозревать, что на самом деле это работает. Были случаи, когда появились недокументированные объекты ([иногда неуверенно] (http://stackoverflow.com/questions/12500256)), а затем вышли как функции. – Mogsdad

+0

Для тех, кто найдет это в будущем, это было исправлено в выпуске [3926] (https://code.google.com/p/google-apps-script-issues/issues/detail?id=3926). 'e.source.getActiveSheet()' теперь возвращает правильный лист – Joe

Смежные вопросы