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

时间:2017-08-23 00:22:36

标签: google-apps-script google-sheets

我在google-apps中有一个工作表(" WS-1"),它可以执行某个过程...... 然后,我有另一张工作表" WS-2"通过Vlookup和importrange读取该信息。

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

这可能吗? 谢谢!!

P.S。:另一个解决方案是让WS-1中的脚本每天自动运行..

2 个答案:

答案 0 :(得分:0)

是的,可能......但请进一步阅读

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

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

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

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()函数,并且你遵循两者之间的已知协议。

这就是每个电子表格上的消息表:

enter image description here

enter image description here

所以我认为考虑到这些警告,电子表格可能导致另一个远程电子表格执行已包含在项目中的特定操作被触发读取readMessages函数。

如果没有触发器来启动读取操作,则一个电子表格可以从另一个电子表格中读取数据,但它无法访问其他脚本中包含的函数。

如果我错了,我希望有人纠正我。根据我今天的研究,这就是我的想法。

答案 1 :(得分:0)

是的,这实际上很简单{我经常针对Google表格中的所有形式的表格/公式扩展进行此操作}。您将需要URL中的其他工作表ID,如果您不知道如何获取它,我建议您尽快查找。然后该脚本将起作用

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
}
}