首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >触发脚本在外部工作表google-apps-scripts上执行

触发脚本在外部工作表google-apps-scripts上执行
EN

Stack Overflow用户
提问于 2017-08-23 08:22:36
回答 2查看 2.5K关注 0票数 1

我在google-apps中有一个工作表("WS-1"),它执行特定的过程……然后,我有另一个工作表"WS-2“,它通过Vlookup和importrange读取该信息。

我想从WS-2触发WS1中的脚本(在WS-1中运行),所以我不需要每次都打开WS-1...

这个是可能的吗?谢谢你!!

附注:另一种解决方案是让WS-1中的脚本每天自动运行。

EN

回答 2

Stack Overflow用户

发布于 2017-08-30 05:51:59

是的,这是possible...but,请进一步阅读

让我从一开始就说,当我使用术语电子表格时,我试图以API使用它的相同意义来使用它。所以在我的词汇表中没有工作表这样的东西。有包含工作表的电子表格。

今天早上我花了一些时间思考这个问题。我拿了两个电子表格,并编写了一些函数,看看是否可以让不同电子表格中的项目进行交流,或者让同一电子表格中的项目进行交流,并且尽可能接近。它们是自治的实体。在它们外部定义的函数在它们内部是未定义的。因此,如果您想要触发另一个展开以使用其脚本项目中包含的函数执行操作,则必须为该项目脚本设置一个触发器。

我更进一步,使用了两个电子表格,我创建了一个简单的协议,通过使用基于时间的触发器让他们阅读他们的消息表,让他们彼此通信。它们都有相似的消息表。您可以使用与以下函数类似的readMessages函数让它们执行多个操作:

代码语言:javascript
复制
function readMessages()
{
  var ss=SpreadsheetApp.openById(SS1ID);
  var sh=ss.getSheetByName('Messages');
  var rg=sh.getDataRange();
  var vA=rg.getValues();
  var br='<br />';
  var s='';
  var hA=vA[0];
  for(var i=1;i<vA.length;i++)
  {
    var data=vA[i];
    if(data[data.length-1]=='sent')
    {
      switch(data[data.length-2])
      {
        case 'Read Data':
          data[data.length-1]='rcvd';
          readData()
          break;
        case 'No Action Required':
          data[data.length-1]='rcvd';
          ackMessage(data);
          break;
        default:
          data[data.length-1]='rcvd';
          sendMessage(['Unknown Message Type']);
          break;

      }

    }
  }
  rg.setValues(vA);
}

我实际上并没有设置基于时间的触发器,我只是手动运行readMessages()函数,但效果是一样的。通过从一个电子表格发出命令,您可以使另一个电子表格执行所需的操作。只要有一些触发源可以触发远程工作表执行readMessages()函数,并且您遵循两者之间的已知协议。

以下是每个电子表格上的消息表单的外观:

所以,是的,,我认为记住这些注意事项,一个电子表格可能会导致另一个远程电子表格执行特定的操作,这些操作已经包含在被触发来读取readMessages函数的项目中。

如果没有触发器来启动读取操作,那么一个电子表格可以从另一个电子表格读取数据,但是它不能访问包含在另一个脚本中的函数。

如果我错了,我希望有人纠正我。这是我根据今天的学习所想的。

票数 3
EN

Stack Overflow用户

发布于 2020-12-08 21:30:37

是的,这实际上相当简单{我经常在google sheets中对各种形式的工作表/公式进行扩充}。你将需要URL中的另一个工作表id,如果你不知道如何获取它,我建议你尽快查找它。然后这个脚本就可以工作了

代码语言:javascript
复制
function Correction() {
  var rowrange = SpreadsheetApp.getActive().getSheetByName('Sheetname').getRange('Rangeofsheetname');
  var rowdata = rowrange.getValues();
  var sheet = SpreadsheetApp.getActive().getSheetByName('Sheetname');
  for (var i = 0; i<rowdata.length; ++i) {
    row = rowdata[i];
    var sheetIDs = row[0];
    var values = sheet.getRange('rangewithformulawithno=sign').getValue(); //Current sheet/range that you want to copy into the new sheet
    SpreadsheetApp.openById(sheetIDs).getSheetByName('Sheettofix').getRange('Range').setFormula("="+values); //destination sheet/range that you want to copy values into
    
    // note that the above will insert a formula from the table that youve created, you could augment line 9 to do whatever you would normally do in your current sheet with the exception of commands that require UI... UI commands should be worked around with non-UI based commands
}
}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45828780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档