从同一个脚本文件中调用另一个函数

时间:2013-12-06 16:08:56

标签: function google-apps-script

在这篇文章中,Serge回复说:"但是当然,你可以使用项目内不同脚本文件中的任何函数"。

这样做的协议是什么?

我有一个功能,我想在三个不同的脚本中使用。它非常密集,我不断改进它,所以我不想在函数之间复制和粘贴所有代码。这些文件都在同一个项目中。 Serge在此链接上的回复是我可以确认的最接近的回复,但它没有给出协议。

How to make a call from one Google Apps Script to a function in another?

更具体地说,我有一个删除文件,抓取模板,复制,重命名,并用电子表格中的当前数据填充的功能。我希望在几个电子邮件脚本中运行该功能,这些脚本会在不同时间向不同的人发送不同的消息。

谢谢!

MOGSDAD回复后更新:

我有5个.gs文件,都在同一个脚本项目中(比如您在示例中显示的两个.gs文件。一个创建一个新文件(newFile.gs),其他文件用于在不同时间发送电子邮件一个.gs文件的例子如下所示:

function emailNewDoc() {

//Here's where I want to run the script newFile.gs so that the new doc is created before the mail goes out

var message = "Hi,";
message += '<a href='+url+'>Here's the new document</a>' //url is defined in newDoc.gs after the new document is created

var subject = "The updated document"
var recipients = "xyz@xyz.com"

MailApp.sendEmail(recipients, subject, message);

}

正如您所看到的,我不知道在第二行输入什么内容以使newFile.gs作为emailNewDoc.gs的一部分运行。抱歉迂腐。我是一个新手,但是如果我能弄清楚基础知识,那么认为谷歌脚本会永远改变我的生活。

***编辑后的评论

Serge,这里是原始.gs文件中的代码

function newFile() {

var docTemplate = "[insert template doc key here]"; //this one uses the document key, not the file name like mine did
var copy = DocsList.getFileById(docTemplate).makeCopy("my DOCUMENT");
var url = copy.getUrl();
var copyId = copy.getId();
var copyDoc = DocumentApp.openById(copyId);
var body = copyDoc.getActiveSection();
body.replaceText('{date}', Utilities.formatDate(new Date(sheet.getRange('A1').getValues()), SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "MMM dd"));
}

正如您所看到的,我定义了URL,这是我想要引入另一个函数的变量,因此我可以通过电子邮件发送它。

再次感谢!

3 个答案:

答案 0 :(得分:2)

我想我理解你提出的问题。这是一个示例项目,其功能用于设置我的解释:

scriptOne.gs:

  • 泛函();
  • functionB();
  • functionC();

scriptTwo.gs:

  • functionD();
  • functionE();
  • 函数f();

在scriptOne.gs中,我可以通过这样做来调用functionD():

functionA() {
  functionD();
}

functionB() {
}

functionC() {
}

我知道它看起来非常简单,但我使用这个简单的命名法来调用其他项目中的函数。这不适合你吗?如果你能提供一个明确的例子,你可以尝试给你一个更好的答案。

如果您尝试在一行中运行scriptTwo.gs中的所有函数,那么我将在scripTwo.gs中创建一个runScriptTwo()函数,该函数调用scriptTwo.gs文件中的所有函数。然后,您可以在我的第一个代码中调用runScriptTwo(),而不是调用functionD()。这有意义吗?

答案 1 :(得分:1)

另一个答案是澄清你的最后一点:

以下是调用其他函数的代码:

function emailNewDoc() {
var url = newFile();  // this is calling the other function and gets the value you need from it  
var message = "Hi,";
message += '<a href='+url+'>Here's the new document</a>' //url is defined in newDoc.gs after the new document is created

var subject = "The updated document"
var recipients = "xyz@xyz.com"

MailApp.sendEmail(recipients, subject, 'please read html body',{htmlBody : message} );

}

并在另一个函数中(最终在同一项目中的另一个.gs文件中更改函数的结尾):

function newFile() {
  var docTemplate = "[insert template doc key here]"; //this one uses the document key, not   the file name like mine did
  var copy = DocsList.getFileById(docTemplate).makeCopy("my DOCUMENT");
  var url = copy.getUrl();
  var copyId = copy.getId();
  var copyDoc = DocumentApp.openById(copyId);
  var body = copyDoc.getActiveSection();
  body.replaceText('{date}', Utilities.formatDate(new   Date(sheet.getRange('A1').getValues()), SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "MMM dd"));
  return url;// this returns the value you need in the other function
}

答案 2 :(得分:0)

Serge的回复是关于脚本项目中的脚本文件。脚本项目可以有多个文件。以下是创建它们的方法:

Screenshot

在这个例子中,我们有两个“gs”文件,“Code”和“Utilities”:

Screenshot

项目中的任何函数都可以通过调用它来调用Utilities.gs中的getHtmlTable()函数。没有特殊的协议要求。

您可以使用其他脚本中的函数的主要方法是创建和附加库。一旦你了解它们,就没那么多了。从Google Apps Script "Libraries" doc。

开始