首页 > 解决方案 > 在 Google 表格中使用多选下拉菜单进行数据验证

问题描述

我对谷歌脚本的经验很少,但是我需要创建一个谷歌表格,使用数据验证来限制通过“多选”下拉列表输入特定列的内容。谷歌表格有一个内置的数据验证功能,允许从下拉列表中选择一个“单一”选项,但是我需要我的谷歌表格来允许从一个受限制的选项列表中为一个单元格选择多个选项。

浏览 Internet 后,我​​找到了该作业的 Google 脚本(网站链接在这里),但是,当我将此脚本应用到我的电子表格时,我收到以下错误消息。

TypeError:无法读取未定义 onEdit @ Code.gs:7 的属性“值”

下面是我一直在使用的脚本。

function onEdit(e) {
var oldValue;
var newValue;
var ss=SpreadsheetApp.getActiveSpreadsheet();
var activeCell = ss.getActiveCell();
if(activeCell.getColumn() == 7  && ss.getActiveSheet().getName()=="Daniel") {
newValue=e.value;
oldValue=e.oldValue;
if(!e.value) {
activeCell.setValue("");
}
else {
if (!e.oldValue) {
activeCell.setValue(newValue);
}
else {
if(oldValue.indexOf(newValue) <0) {
activeCell.setValue(oldValue+'|'+newValue);
}
else {
activeCell.setValue(oldValue);
}
}
}
}
}

我很想听听关于脚本可能存在的问题的想法。

标签: validationgoogle-apps-scriptgoogle-sheets

解决方案


试试这种方式:

function onEdit(e) {
  const sh = e.range.getSheet();
  if (e.range.columnStart == 7 && sh.getName() == "Daniel") {
    if (!e.value) {
      e.range.setValue("");
    }
    else {
      if (!e.oldValue) {
        e.range.setValue(e.value);
      }
      else {
        if (e.oldValue.indexOf(e.value) < 0) {
          e.range.setValue(e.oldValue + '|' + e.value);
        }
        else {
          e.range.setValue(e.oldValue);
        }
      }
    }
  }
}

请记住,您不能只从菜单或脚本编辑器中运行这样的功能。如果你没有做任何需要权限的事情,那么你可以用一个简单的触发器来运行它。如果您正在执行需要权限的操作,那么您必须选择除 onEdit 之外的名称并使用可安装的触发器。

试着把这个放在一张空白的 Sheet1 上并设置第 7 列有一个下拉菜单。在更改第 7 列时,您将能够看到事件对象中的值显示在单元格 A1 中。您还将看到该功能何时工作,因为它在工作表中显示了一个 toast。

function onEdit(e) {
  e.source.toast('entry');
  const sh = e.range.getSheet();
  sh.getRange(1,1).setValue(JSON.stringify(e));
  if (e.range.columnStart == 7 && sh.getName() == "Sheet1") {
    if (!e.value) {
      e.range.setValue("");
    }
    else {
      if (!e.oldValue) {
        e.range.setValue(e.value);
      }
      else {
        if (e.oldValue.indexOf(e.value) < 0) {
          e.range.setValue(e.oldValue + '|' + e.value);
        }
        else {
          e.range.setValue(e.oldValue);
        }
      }
    }
  }
}

这是它现在正在做什么的一个小动画。

在此处输入图像描述


推荐阅读