【问题标题】:How do I deselect an active cell when clicking on an image to run a script?单击图像以运行脚本时如何取消选择活动单元格?
【发布时间】:2015-12-02 18:16:29
【问题描述】:

我有一个电子表格绑定脚本,通过单击电子表格中的图像来调用该脚本。我发现如果需要修改的单元格处于活动状态或正在被用户编辑,则脚本可能会被阻止。

代码可以是任何东西,甚至像这样简单:

function newf() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var range = sheet.getRange("R4");
  range.clear();
}

当单元格R4打开时,函数将忽略该单元格。

单击图像运行脚本时如何取消选择打开的单元格?

简单的(手动)解决方案是在单击图像之前单击打开的单元格,但我试图使脚本万无一失,这可能是一个代价高昂的问题。该函数有什么方法可以强制取消选择活动单元格?

编辑:我不是指活动单元格。绝对是“开放式细胞”。这是错误的图片。

打开单元格并输入数据

点击图片,程序运行

【问题讨论】:

  • 我想你想谈谈活动单元格,而不是打开的单元格。为此,您可以使用函数 setActiveRange,该函数采用参数范围,该范围可能是您想要激活的单元格。 (使用 getRange(x,y,1,1) 其中 (x,y) 将是您的单元格的坐标)。

标签: google-apps-script google-sheets


【解决方案1】:

您可以使用Sheet.setActive() 将附加用户的光标移动到电子表格中的其他位置。您需要记住,用户界面和从中调用的脚本之间存在关系,这使脚本能够确定和更改当前活动的单元格。但是,这不会扩展到多用户情况 - 如果在 User2 单击以运行脚本时 User1 正在编辑受保护的单元格,则脚本将不知道它。

function newf() {
  var safePlace = "A1"; // Some safe cell
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  var activeCell = ss.getActiveCell();
  if (activeCell.getSheet() == sheet && activeCell.getA1Notation() == "R4") 
    sheet.setActiveSelection(safePlace);
  var range = sheet.getRange("R4");
  var activeCell = ss.getActiveCell();
  if (activeCell.getA1Notation() == range.getA1Notation() && activeCell.getSheet().getName() == range.getSheet().getName()) {
    // Move user from target cell
    sheet.setActiveSelection(safePlace);
  range.clear();
}

【讨论】:

  • 和以前一样的问题,打开的单元格被忽略,直到脚本完成。此解决方案现在将打开单元格中的信息放入另一个选定的“safePlace”,但不执行脚本的功能。
【解决方案2】:

我遇到了同样的问题,无论是最初的问题还是 Mogsdad 提出的解决方案。

我是这样解决的:

在运行任何脚本之前,前三行会打开一个不同的工作表并刷新电子表格:

var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('DIFFERENT SHEET NAME'), true);
  SpreadsheetApp.flush();

脚本的其余部分如下。

然后在脚本的最后,我用一个简单的语句重新打开初始表:

spreadsheet.setActiveSheet(spreadsheet.getSheetByName('ORIGINAL SHEET NAME'), true);

【讨论】:

  • SpreadsheetApp.flush() 为我工作,谢谢。
【解决方案3】:

对此的另一个“解决方案”是不使用按钮,而是使用复选标记,就像我们是按钮一样,并使用 onEdit 函数。

function onEdit(e)
{
 
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  checkbox1 = ss.getRange("saveCheckbox_001");
  if (checkbox1.isChecked())
  {
    submit1(); //do all the fun stuff associated with this checkbox
    checkbox1.uncheck();
  }

  //more checkbox handling and calling other functions can go here if you need more than one "button"

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多