Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 由多个范围内的编辑触发的OneEdit(e)_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script 由多个范围内的编辑触发的OneEdit(e)

Google apps script 由多个范围内的编辑触发的OneEdit(e),google-apps-script,google-sheets,Google Apps Script,Google Sheets,我有一个脚本,它可以清除几个命名范围内的值(如果它们被编辑)。我成功地将OnEdit(e)触发器配置为在编辑单个命名范围时触发,但无法确定如何将其展开以在编辑任何范围时触发。 我想我可以为指定的范围设置几个变量(例如,MyRange2、MyRange3等),但在这种情况下,我需要为我试图避免的每个变量复制IF语句 我还试图将myRange定义为数组,但它似乎与以下条件相矛盾: var myRange=[ss.getRangeByName('total1')、ss.getRangeByName('

我有一个脚本,它可以清除几个命名范围内的值(如果它们被编辑)。我成功地将OnEdit(e)触发器配置为在编辑单个命名范围时触发,但无法确定如何将其展开以在编辑任何范围时触发。 我想我可以为指定的范围设置几个变量(例如,MyRange2、MyRange3等),但在这种情况下,我需要为我试图避免的每个变量复制IF语句

我还试图将myRange定义为数组,但它似乎与以下条件相矛盾:
var myRange=[ss.getRangeByName('total1')、ss.getRangeByName('total2')、ss.getRangeByName('total3')

函数onEdit(e){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var myRange=SpreadsheetApp.getActiveSheet().getRange('total1');
var row=e.range.getRow();
var col=e.range.getColumn();
如果(col>=myRange.getColumn()&&col=myRange.getRow()&&row解释:
  • 确保充分利用。您希望花费尽可能少的资源,并将每次编辑时要执行的所有绝对必要的代码放在可以结束代码执行的主
    if
    条件之前。例如
    var myRange=SpreadsheetApp.getActiveSheet().getRange('total1')
    不需要为每次编辑执行

  • 我假设您要为特定的工作表运行脚本。在我的代码中,我使用了
    Sheet1
    ,并添加了
    if
    条件来检查您编辑的工作表是否为
    Sheet1
    。如果您不希望出现这种行为,请删除此
    if
    条件和括起来的括号
    if(as.getName()=“Sheet1”)
    。然后,您的代码将自动适用于文档中的每个工作表(只要此工作表中的名称范围符合您的标准)

  • 定义命名范围的名称列表
    [“total1”、“total2”、“total3”]
    ,脚本将迭代所有命名范围,并确保仅针对这些命名范围执行代码块

  • 如果上述所有
    If
    条件的计算结果为
    true
    ,请清除名称范围的内容

解决方案:
函数onEdit(e){
常数arng=e.range;///获取活动范围
const as=arng.getSheet();//获取活动工作表
如果(如.getName()=“Sheet1”){
const nranges=[“total1”、“total2”、“total3”];//在此处添加范围的名称
//让我们获取活动单元格的行和列索引
const namedRanges=as.getNamedRanges();//获取所有命名范围
常量行=arng.getRow();
const col=arng.getColumn();
namedRanges.forEach(nr=>{
if(nranges.includes(nr.getName())){
设nrange=nr.getRange();
如果(col>=nrange.getColumn()&&col=nrange.getRow()&&row解释:
  • 确保充分利用。您希望花费尽可能少的资源,并将每次编辑时要执行的所有绝对必要的代码放在可以结束代码执行的主
    if
    条件之前。例如
    var myRange=SpreadsheetApp.getActiveSheet().getRange('total1')
    不需要为每次编辑执行

  • 我假设您要为特定的工作表运行脚本。在我的代码中,我使用了
    Sheet1
    ,并添加了
    if
    条件来检查您编辑的工作表是否为
    Sheet1
    。如果您不希望出现这种行为,请删除此
    if
    条件和括起来的括号
    if(as.getName()=“Sheet1”)
    。然后,您的代码将自动适用于文档中的每个工作表(只要此工作表中的名称范围符合您的标准)

  • 定义命名范围的名称列表
    [“total1”、“total2”、“total3”]
    ,脚本将迭代所有命名范围,并确保仅针对这些命名范围执行代码块

  • 如果上述所有
    If
    条件的计算结果为
    true
    ,请清除名称范围的内容

解决方案:
函数onEdit(e){
常数arng=e.range;///获取活动范围
const as=arng.getSheet();//获取活动工作表
如果(如.getName()=“Sheet1”){
const nranges=[“total1”、“total2”、“total3”];//在此处添加范围的名称
//让我们获取活动单元格的行和列索引
const namedRanges=as.getNamedRanges();//获取所有命名范围
常量行=arng.getRow();
const col=arng.getColumn();
namedRanges.forEach(nr=>{
if(nranges.includes(nr.getName())){
设nrange=nr.getRange();
如果(col>=nrange.getColumn()&&col=nrange.getRow()&&row
function onEdit(e) {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
  var myRange = SpreadsheetApp.getActiveSheet().getRange('total1');
 
  var row = e.range.getRow();
  var col = e.range.getColumn();

  if (col >= myRange.getColumn() && col <= myRange.getLastColumn() && row >= myRange.getRow() && row <= myRange.getLastRow()) { 
        var name_arr = ['total1', 'total2', 'total3'];
        for (var name of name_arr) {
        var ss = SpreadsheetApp.getActiveSpreadsheet();
        var range = ss.getRangeByName(name).clearContent();
        }    ;
      } else {
        return;
      }
    };
function onEdit(e) {
  const arng = e.range; // // get active range
  const as = arng.getSheet(); // get active sheet
  if(as.getName()=="Sheet1"){
      const nranges = ["total1","total2","total3"]; // add here the names of the ranges
      //Let's get the row & column indexes of the active cell
      const namedRanges = as.getNamedRanges(); // get all named ranges
      const row = arng.getRow();
      const col = arng.getColumn();
      namedRanges.forEach(nr=>{
        if (nranges.includes(nr.getName())){
          let nrange = nr.getRange();
          if (col >= nrange.getColumn() && col <= nrange.getLastColumn() 
              && row >= nrange.getRow() && row <= nrange.getLastRow()) { 
               nrange.clearContent(); // clear the range of the named range
          }
        }
      });     
  }
}