首页 > 解决方案 > 让脚本从具有多个选项卡的工作表中的下拉菜单运行

问题描述

希望我在正确的地方。我正在制定维护计划,但遇到了一些麻烦。我所拥有的是在工作表中创建的工作订单表,我编写了一个脚本,它将以新名称(与工作表中的单元格值绑定)保存模板的副本,驱动器上的文件夹。我也有这个脚本在谷歌日历上安排工作订单。此代码如下。

function Create() {
  var ss = SpreadsheetApp.getActiveSpreadsheet(); // Get spreadsheet
  var id = ss.getId(); // Get spreadsheet ID
  var sstocopy = DriveApp.getFileById(id); //Get spreadsheet with DriveApp
  var sheet = ss.getActiveSheet(); // Grab the sheet in order to find the name of the new spreadsheet 
  to be created
  var sheet_name = sheet.getRange("C4").getValue(); // Get the value, in this case: Project Urn
  var folder = DriveApp.getFolderById("1D9gWUuHTPbWkzpSOp5vQdg-K8N6kUGo6"); // Get the folder where 
  the sheet needs to be placed.
  sstocopy.makeCopy(sheet_name,folder); // Make the copy of the sheet in that folder.

  var eventCal = 
  CalendarApp.getCalendarById("c_4um01s3eqvq7d5kqi0ga4i1098@group.calendar.google.com") ;
   var eventname = sheet_name;
   var eventstart = sheet.getRange("E3").getValue();
 var eventstop = sheet.getRange("E4").getValue();
  eventCal.createAllDayEvent(eventname, eventstart, eventstop);
  } 

现在这段代码运行良好,我最初在工作表上有一个可点击的按钮来运行这段代码,并且在计算机上运行良好。棘手的部分是我希望能够从 Ipad 的移动应用程序中运行它。所以我一直在尝试设置一个下拉菜单来运行脚本。我的工作表文件有几个页面/标签,我认为这是给我带来问题的原因。我假设我需要调用正确的工作表,但我似乎无法让它工作。

我尝试的第一个代码是这个(除了我的下拉菜单在 F3 中)

function onEdit(e) {
  if (e.range.getA1Notation() == 'A1') {
    if (/^\w+$/.test(e.value)) {        
      eval(e.value)();
      e.range.clear();
    }
  }
}
    

但我收到 e.range.getA1Notation 的未定义错误。我尝试了其他一些事情,但我真的不知道自己在做什么,因为我的理解非常基础,而且我已经很长时间没有真正做过这样的事情了。任何帮助,将不胜感激。

标签: validationgoogle-apps-scriptgoogle-sheetsmobiletriggers

解决方案


这是您可以使用复选框作为按钮来运行功能的一种方法。为此,我使用了一个可安装的 onEdit(e) 触发器,以便它可以执行需要权限的功能。

function onMyEdit(e) {
  e.source.toast('Entry');
  console.log(JSON.stringify(e));//use this to see all of the features in the event object
  const sh=e.range.getSheet(); 
  if(sh.getName()=="Your Sheet Name" && e.range.columnStart==1 && e.value=="TRUE" ) {
    e.range.setValue('FALSE');
    switch(e.range.rowStart) {
      case 1:
        e.source.toast('function 1');
        break;
      case 2:
        e.source.toast('function 2');
    }
  }
}

我没有附加任何功能,我的想法是我有 e.source.toast('function 1'); 您将用函数调用替换整行。这被设置为只运行一页,但如果需要可以修改。

动画:

在此处输入图像描述

如您所见,它可以设置为每次重置复选框,而不是显示您选择的功能的吐司。您始终可以在函数名称的复选框旁边放置标签。

而这个例子使用数据验证来创建一个下拉函数选择过程。重要的是要记住 onEdit() 函数必须在 30 秒内完成。

function onMyEdit(e) {
  e.source.toast('Entry');
  console.log(JSON.stringify(e));
  const sh=e.range.getSheet(); 
  if(sh.getName()=="Your Sheet Name" && e.range.columnStart==1 && e.value=="TRUE" ) {
    e.range.setValue('FALSE');
    switch(e.range.rowStart) {
      case 1:
        e.source.toast('function 1');
        break;
      case 2:
        e.source.toast('function 2');
    }
  }
  if(sh.getName()=="Your Sheet Name" && e.range.columnStart==2 && e.range.rowStart==1 && e.value) {
    switch(e.value) {
      case '1':
        e.source.toast('function 1');
        break;
      case '2':
        e.source.toast('function 2');
    }
    e.range.setValue('');
  }
}

动画:

在此处输入图像描述

事件对象


推荐阅读