首页 > 解决方案 > 在某人可以对列进行排序之前显示对话框

问题描述

  1. 我有一列数字(查询结果)。
  2. 除非我将其格式化为数字(格式菜单 > 数字 > 数字),否则数字不会相加。
  3. 将它们格式化为数字后,我得到总数。但是,电子表格的用户不知道或忘记了将数字格式化为数字的步骤。
  4. 他们触发这种情况的唯一动作是使用 row1:col2 对 col2 进行排序时
  5. 我正在考虑一种解决方案来显示一个对话框,上面写着“请通过转到格式菜单>数字>数字将col 2格式化为数字”
  6. 我尝试为 row1:col2 添加 onEdit 但这在用于排序时不起作用(仅在编辑单元格值时起作用)。

需要帮助:当col2不是数字格式时显示对话框,然后他们可以使用E85中的标题对其进行排序。

试过:

function onEdit(e) {
var ss = "REPORTS (AUTO)";
var row = e.range.getRow();
if (e.range.getA1Notation() === 'E85' && e.source.getActiveSheet().getName() === ss){
<show dialog box code here...>
}

标签: google-apps-scriptgoogle-sheets

解决方案


排序不会onEdit触发触发器,但会触发可安装 onChange的触发器

现在您可以编写如下函数:

function bindMeToAnOnChangeTrigger(e){
  if(e.changeType=="OTHER"){
    SpreadsheetApp.getUi().alert("Please go to Format menu > Number > Number");
  }
}
  • 请注意,您需要手动将函数绑定bindMeToAnOnChangeTrigger(e)到可安装的onEdit触发器,方法是继续Edit->Current Project's triggers->New trigger
  • 请注意,某些其他onCahnge类型的事件OTHER也可能触发触发器,因此您可能希望实施其他标准来验证是否应向用户发出警报。

更新

如果您想在显示警报之前实现附加条件检查单元格格式,您可以使用getNumberFormats()

function bindMeToAnOnChangeTrigger(e){
  if(e.changeType=="OTHER"){
    var sheetName = "REPORTS (AUTO)";
    var range = e.source.getSheetByName(sheetName).getRange("A2:A20");
    var formats = range.getNumberFormats().flat();
    Logger.log(formats);
    //Please set here your desired number format
    var desiredFormat = "0.###############"
    for(var i = 0; i < formats.length; i++){
      if(formats[i] != desiredFormat){
        return;
      }
    }
    SpreadsheetApp.getUi().alert(e.source.getActiveSheet().getActiveCell().getA1Notation());
  }
}

推荐阅读