Google apps script 如何将多项目选择下拉列表设置为仅在特定范围内工作

Google apps script 如何将多项目选择下拉列表设置为仅在特定范围内工作,google-apps-script,google-sheets,Google Apps Script,Google Sheets,此脚本允许您在一个单元格中选择更多数据 以逗号分隔 但现在它可以在整个工作表中工作 如何将其修改为仅在这些范围内工作? ['B3:U27'],['W3:AP27'] 我试过的是我在谷歌上看到的 但它什么也没做,只是选择了突出显示这些范围B3:U27,W3:AP27 function onEdit(e) { var oldValue; var newValue; var ss = SpreadsheetApp.getActiveSpreadsheet(); var active

此脚本允许您在一个单元格中选择更多数据 以逗号分隔

但现在它可以在整个工作表中工作 如何将其修改为仅在这些范围内工作? ['B3:U27'],['W3:AP27']

我试过的是我在谷歌上看到的

但它什么也没做,只是选择了突出显示这些范围B3:U27,W3:AP27

function onEdit(e) {
  var oldValue;
  var newValue;

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var activeCell = ss.getActiveCell();
  
  if (activeCell.getColumn() > 1) {
    newValue = e.value;
    oldValue = e.oldValue;

    if (!e.value) {
      activeCell.setValue("");

    } else {
      if (!e.oldValue) {
        activeCell.setValue(newValue);
        
      } else {
        if (newValue.indexOf(oldValue) < 0) {
          activeCell.setValue(oldValue + ', ' + newValue);

        } else {
          activeCell.setValue(newValue);

        };
      };
    };
  };
}
提前感谢您的帮助

您需要找到e.range是否在您列出的范围内,如果不在其中一个范围内,请提前从OneEdit返回。试试这个:

/**
* Appends the text string entered in a magic cell to the previous contents in the cell.
*/
function onEdit(e) {
  const magicCells = ['Sheet1!B3:U27', 'Sheet1!W3:AP27'];
  const ss = SpreadsheetApp.getActive();
  let intersect;
  if (e.value === undefined
    || !e.oldValue
    || !magicCells.some(rangeA1 => (intersect = getRangeIntersection_(e.range, ss.getRange(rangeA1))))) {
    return;
  }
  let update = e.oldValue;
  if (String(e.oldValue).indexOf(e.value) === -1) {
    update += ', ' + e.value;
  }
  intersect.range.setValue(update);
}

/**
* Returns the intersection of two ranges as an object that contains the sheet,
* a new range, and the range's grid coordinates and dimensions.
*
* @param {SpreadsheetApp.Range} range A spreadsheet range object.
* @param {SpreadsheetApp.Range} intersectingRange A spreadsheet range object that possibly overlaps range.
* @return {Object} The intersection of range and intersectingRange, or null if they do not overlap. The return object has these fields:
*                  sheet       The sheet of range.
*                  range       The cells common to range and intersectingRange.
*                  rowStart    The first row of the intersection.
*                  columnStart The first column of the intersection.
*                  rowEnd      The last row of the intersection.
*                  columnEnd   The last column of the intersection.
*                  numRows     The number of rows in the intersection.
*                  numColumns  The number of columns in the intersection.
*/
function getRangeIntersection_(range, intersectingRange) {
  // version 1.4, written by --Hyde, 19 October 2020
  var sheet = range.getSheet();
  if (sheet.getSheetId() !== intersectingRange.getSheet().getSheetId()) {
    return null;
  }
  var rowStart = Math.max(range.getRow(), intersectingRange.getRow());
  var rowEnd = Math.min(range.getLastRow(), intersectingRange.getLastRow());
  if (rowStart > rowEnd) {
    return null;
  }
  var columnStart = Math.max(range.getColumn(), intersectingRange.getColumn());
  var columnEnd = Math.min(range.getLastColumn(), intersectingRange.getLastColumn());
  if (columnStart > columnEnd) {
    return null;
  }
  return {
    sheet: sheet,
    range: sheet.getRange(rowStart, columnStart, rowEnd - rowStart + 1, columnEnd - columnStart + 1),
    rowStart: rowStart,
    columnStart: columnStart,
    rowEnd: rowEnd,
    columnEnd: columnEnd,
    numRows: rowEnd - rowStart + 1,
    numColumns: columnEnd - columnStart + 1,
  };
}

学习谷歌应用程序脚本的一些最佳资源包括、、代码实验室、和。

欢迎来到StackOverFlow。请借此机会学习如何使用,并提出一个真正的问题。提供回答问题所需的所有详细信息。你在尝试什么?你的数据是什么样子的?你希望它如何更改。多个相关下拉列表:非常感谢你的帮助,但查看这里的脚本对我来说是全新的。我所了解的是,你将数据分为多个工作表,以前在整个电子表格中工作,但我想我可以用这行常量rangesA1=['B3:U27','W3:AP27']来修复它;对不起大家,我甚至不认为有两个范围需要更改整个脚本!我还以为只有几行呢。。任何理解该脚本的人都知道将我的脚本粘贴到何处对不起,但我猜您希望该脚本在单元格中以前的内容后面附加一个在魔法单元格中输入的文本字符串。根据我认为你可能追求的目标,编辑了答案中的脚本,使其功能全面。哦,是的,你是最好的!!感谢您在脚本中包含它。我记下你的答案!当我在单元格中选择一个项目时,我想再问一件在我的脚本中有用的事情,然后是另一件我可以在同一单元格中手动写入文本,而不复制所有内容,如果我将这两个e.oldValue e.value交换为e.value e.oldValue,它不会复制,但它也会删除我手动写入的内容,如果Stringe.value.indexOfe.oldValue===-1您知道如何激活它以接受所选项目/项目后手动键入的文本吗?这是另一个问题。请分开邮寄。
/**
* Appends the text string entered in a magic cell to the previous contents in the cell.
*/
function onEdit(e) {
  const magicCells = ['Sheet1!B3:U27', 'Sheet1!W3:AP27'];
  const ss = SpreadsheetApp.getActive();
  let intersect;
  if (e.value === undefined
    || !e.oldValue
    || !magicCells.some(rangeA1 => (intersect = getRangeIntersection_(e.range, ss.getRange(rangeA1))))) {
    return;
  }
  let update = e.oldValue;
  if (String(e.oldValue).indexOf(e.value) === -1) {
    update += ', ' + e.value;
  }
  intersect.range.setValue(update);
}

/**
* Returns the intersection of two ranges as an object that contains the sheet,
* a new range, and the range's grid coordinates and dimensions.
*
* @param {SpreadsheetApp.Range} range A spreadsheet range object.
* @param {SpreadsheetApp.Range} intersectingRange A spreadsheet range object that possibly overlaps range.
* @return {Object} The intersection of range and intersectingRange, or null if they do not overlap. The return object has these fields:
*                  sheet       The sheet of range.
*                  range       The cells common to range and intersectingRange.
*                  rowStart    The first row of the intersection.
*                  columnStart The first column of the intersection.
*                  rowEnd      The last row of the intersection.
*                  columnEnd   The last column of the intersection.
*                  numRows     The number of rows in the intersection.
*                  numColumns  The number of columns in the intersection.
*/
function getRangeIntersection_(range, intersectingRange) {
  // version 1.4, written by --Hyde, 19 October 2020
  var sheet = range.getSheet();
  if (sheet.getSheetId() !== intersectingRange.getSheet().getSheetId()) {
    return null;
  }
  var rowStart = Math.max(range.getRow(), intersectingRange.getRow());
  var rowEnd = Math.min(range.getLastRow(), intersectingRange.getLastRow());
  if (rowStart > rowEnd) {
    return null;
  }
  var columnStart = Math.max(range.getColumn(), intersectingRange.getColumn());
  var columnEnd = Math.min(range.getLastColumn(), intersectingRange.getLastColumn());
  if (columnStart > columnEnd) {
    return null;
  }
  return {
    sheet: sheet,
    range: sheet.getRange(rowStart, columnStart, rowEnd - rowStart + 1, columnEnd - columnStart + 1),
    rowStart: rowStart,
    columnStart: columnStart,
    rowEnd: rowEnd,
    columnEnd: columnEnd,
    numRows: rowEnd - rowStart + 1,
    numColumns: columnEnd - columnStart + 1,
  };
}