活动工作表更改时的Google表格事件

时间:2015-07-17 20:55:26

标签: google-apps-script google-sheets

当活动表格在Google表格中发生变化时是否会触发事件?每次getActiveSheet()的结果发生变化时,我都想调用一个函数来更新我构建的侧边栏中的某些值,以帮助在特别大的Google电子表格中进行导航。

2 个答案:

答案 0 :(得分:4)

您可以使用onSelectionChange()简单触发器。每当选择了新小区时,当活性片改变包括将火。 (这是introduced April 22, 2020,早在提出原始问题之后。)

当用户在电子表格中更改选择时,onSelectionChange(e)触发器将自动运行。大多数onSelectionChange(e)触发器使用事件对象中的信息进行适当的响应。

一个字符串化的事件对象看起来像这样:

{
  "authMode": {},
  "range": {
    "rowEnd": 1,
    "columnStart": 1,
    "rowStart": 1,
    "columnEnd": 1
  },
  "source": {}, // Represents the spreadsheet itself
  "user": {
    "nickname": "NICKNAME",
    "email": "EMAIL"
  }
}

只要活动工作表发生更改(第一次运行时除外),就会显示一个消息框。它还尝试将对作为quota exists的PropertiesService的调用最小化。请注意,它使用工作表ID,因为它们是不可变的,与工作表名称不同。

function onSelectionChange(e) {
  if (activeSheetChanged(e.range.getSheet().getSheetId())) {
      Browser.msgBox(e.range.getSheet().getName());
  }
}

/**
 * Check if the active sheet changed.
 * Will give a false positive if no value exists in the properties.
 * @returns {boolean}
 */
function activeSheetChanged(newSheetId) {
  const key = 'activeSheetId';
  const cache = CacheService.getUserCache();
  let properties;
  const savedSheetId = getSavedSheetId();
  if (savedSheetId != newSheetId) {
    saveSheetId(newSheetId);
    return true;
  }
  return false;
  
  /**
   * Get the saved sheet ID from the Cache/Properties.
   * @returns {Number}
   */
  function getSavedSheetId() {
    let savedSheetId = cache.get(key);
    if (savedSheetId == null) {
      properties = getProperties();
      savedSheetId = properties.getProperty(key);
      cache.put(key, savedSheetId);
    }
    return cache.get(key);
  }
  
  /**
   * Save the sheet ID to the Cache & Properties
   */
  function saveSheetId(sheetId) {
    properties = properties ? properties : getProperties();
    properties.setProperty(key, sheetId);
    cache.put(key, sheetId);
  }
  
  /**
   * @returns {PropertiesService.Properties}
   */
  function getProperties() {
    return PropertiesService.getUserProperties();
  }
}

答案 1 :(得分:2)

要在不同的工作表之间切换时执行代码,可以使用onSelectionChange(e)。例如,以下是在切换到 Sheet1 时执行代码的常规代码模板:

  function onSelectionChange(e) {
      
    const as = e.source.getActiveSheet();
      if (as.getName() == 'Sheet1'){ 
        // put your code here
      }
    }

通过这种方式,每次您选择一个不同的工作表时,onSelectionChange(e) 触发活动工作表都会发生变化。然后,您可以在if条件下使用活动工作表来执行您选择的代码块。