首页 > 解决方案 > 编辑特定范围时如何运行函数

问题描述

我有一个功能可以打开一个包含消息和音乐的侧边栏。此功能完美运行,但我希望在showSidebar编辑某些单元格时运行该功能(“Sheet2”上的 C2:E10)。我尝试了以下代码,但是当在电子表格中的任何位置进行编辑时,它仍然运行该函数。

function onEdit(showSidebar){
  var range = 
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2").getRange(2, 3, 10, 1)
}

整页代码在这里:

function onEdit(e){
  var range = e.range;
  var sheetName = e.source.getActiveSheet().getSheetName();
  if ( // C2:E10 on "Sheet2"
    sheetName == "Sheet2" &&
    range.rowStart >= 2 &&
    range.columnStart >= 3 &&
    range.rowStart <= 10 &&
    range.columnStart <= 5
  ) {
    showSidebar();
    // do something
    // showSidebar(); // If you want to run the function of showSidebar(), please use this.

  }
}

var SIDEBAR_TITLE = 'Dashboard Notification!';

/**
 * Adds a custom menu with items to show the sidebar and dialog.
 *
 * @param {Object} e The event parameter for a simple onOpen trigger.
 */
function onOpen(e) {
  SpreadsheetApp.getUi()
      .createAddonMenu()
      .addItem('Show sidebar', 'showSidebar')
      .addToUi();
}

/**
 * Runs when the add-on is installed; calls onOpen() to ensure menu creation and
 * any other initializion work is done immediately.
 *
 * @param {Object} e The event parameter for a simple onInstall trigger.
 */
function onInstall(e) {
  onOpen(e);
}

/**
 * Opens a sidebar. The sidebar structure is described in the Sidebar.html
 * project file.
 */


function showSidebar() {
  var ui = HtmlService.createTemplateFromFile('Sidebar')
      .evaluate()
      .setSandboxMode(HtmlService.SandboxMode.IFRAME)
      .setTitle(SIDEBAR_TITLE);
  SpreadsheetApp.getUi().showSidebar(ui);
} 

编辑:

将此脚本从我的测试区域复制到实时工作表后,在编辑范围时触发器不再起作用。谁能解释为什么会发生这种情况

标签: google-apps-scriptgoogle-sheets

解决方案


  • 您希望在编辑“Sheet2”上的“C2:E10”单元格时运行该脚本。
  • 您正在使用简单触发器的 OnEdit 事件触发器。

如果我的理解是正确的,那么这个示例脚本怎么样?请认为这只是几个答案之一。

示例脚本:

function onEdit(e){
  var range = e.range;
  var sheetName = e.source.getActiveSheet().getSheetName();
  if ( // C2:E10 on "Sheet2"
    sheetName == "Sheet2" &&
    range.rowStart >= 2 &&
    range.columnStart >= 3 &&
    range.rowStart <= 10 &&
    range.columnStart <= 5
  ) {

    // do something
    showSidebar(); // If you want to run the function of showSidebar(), please use this.

  }
}
  • 当有 3 行的值被放入“E10”时,这些值被放入“E10:E12”的单元格中。在此脚本中,该函数运行。
    • 如果您不想在值超出范围时运行,请修改range.rowStart <= 10 && range.columnStart <= 5range.rowEnd <= 10 && range.columnEnd <= 5.

参考:

如果我误解了您的问题并且这不是您想要的结果,我深表歉意。

添加:

如果该函数包含多个需要授权的方法,请使用 OnEdit 事件触发器和可安装触发器。https://developers.google.com/apps-script/guides/triggers/installable

届时请将函数名修改为fullows。

示例脚本:

在使用此脚本之前,请先安装installableOnEdit作为 OnEdit 事件触发器的可安装触发器的功能。您可以在此处查看如何安装它。

function installableOnEdit(e){ // Modified
  var range = e.range;
  var sheetName = e.source.getActiveSheet().getSheetName();
  if ( // C2:E10 on "Sheet2"
    sheetName == "Sheet2" &&
    range.rowStart >= 2 &&
    range.columnStart >= 3 &&
    range.rowStart <= 10 &&
    range.columnStart <= 5 && // Modified
    "value" in e // Added
  ) {

    showSidebar();

  }
}
  • 在这种情况下,函数名称从 修改onEditinstallableOnEdit
    • onEdit作为可安装触发器安装时,简单触发器和可安装触发器都运行。通过将函数名称修改onEdit为其他名称,可以防止重复运行。
  • 当编辑“Sheet2”上的“C2:E10”单元格时,showSidebar()运行。
    • 而且,当范围内的值被删除时,showSidebar()不会运行。

推荐阅读