0

在我的电子表格中,我在 GAS 中插入了 35 个项目,以从同一张表中生成 google doc,其中占位符存在于文档中。
该脚本从包含该脚本的工作表中的每一行中获取字段,并使用 Google Doc 模板(由 TEMPLATE_ID 标识)创建一个 PDF 文档。这些字段替换模板中的占位符。占位符通过在两边都有一个 % 来标识,例如 %Name%。它由“创建 PDF”菜单调用。
自然地,我为每个 Google Doc 模板创建了一个项目(因为我需要来自 35 个不同模板的 35 个不同的文档),所以在我的工作表中,我在菜单中有大约 35 个自定义语音来激活每个脚本。有时有些脚本不会一起出现,所以我必须重新加载工作表才能找到我需要的脚本。
为什么?有办法避免这种情况吗?
脚本是这样的:

var TEMPLATE_ID = 'xxxxxxxx';

var PDF_FILE_NAME = '';

var RESULTS_FOLDER_ID = 'xxxxxxx';

var SENT_COLUMN_NAME = 'Date Sent';

var FILE_NAME_COLUMN_NAME = 'File Name';

var EMAIL_COLUMN_NAME = 'Email';

var DATE_FORMAT = 'yyyy/MM/dd';

var DATE_TIME_FORMAT = 'yyyy/MM/dd HH:mm:ss';

function sendMultiplePdfs() {

  var ui = SpreadsheetApp.getUi();

  if (TEMPLATE_ID === '') {    
    throw new Error('TEMPLATE_ID needs to be defined in Code.gs');
    return;
  }

  var templateFile = DriveApp.getFileById(TEMPLATE_ID); 
  var activeSheet = SpreadsheetApp.getActiveSheet();
  var ranges = activeSheet.getActiveRangeList().getRanges();
  var activeRows = [];

  ranges.forEach(function(range) {
    activeRows.push(range.getValues());
  })

更新:
通过替换从单元格中动态获取值的模板 ID 来解决:

var ss = SpreadsheetApp.openById("ID_OF_THE_SS").getSheetByName("SHEET_NAME");
var TEMPLATE_ID = ss.getRange("RANGE_OF_THE_ID").getValue();
4

1 回答 1

1

AFAIK 没有最大数量的项目可以绑定到 G Suite 编辑器文档,但是对它们进行简单的触发器可能会由于“竞争条件”而导致问题

修辞问题

如果有多个onOpen他们每个人都创建了一个自定义菜单,那么所有这些菜单都会始终以相同的顺序正确显示吗?

一种方法是“参数化”您的项目,即创建 35 个函数来调用接收模板 ID 和其他参数的参数化函数

这 35 个函数可以从菜单、图像以及其他调用方式中调用。


在 Google Apps Script / JavaScript 中,函数如下所示:

function doSomething(){
  console.info('Hello world!');
}

参数化版本可以是

function saySomething(message){
   console.info(message);
}

然后你saySomething通过传递参数的值来调用

function greetTheWorld(){
  var message = 'Hello world!';
  saySomethin(message);
}

在这个项目的情况下,您可以将所有全局变量放在一个对象数组中,每个模板都有一个对象。

var settings = [

  { /* First template */

    TEMPLATE_ID:'xxxxxxxx',

    PDF_FILE_NAME:'',

    RESULTS_FOLDER_ID:'xxxxxxx',

    SENT_COLUMN_NAME:'Date Sent',

    FILE_NAME_COLUMN_NAME:'File Name',

    EMAIL_COLUMN_NAME:'Email',

    DATE_FORMAT:'yyyy/MM/dd',

    DATE_TIME_FORMAT:'yyyy/MM/dd HH:mm:ss'

  },
  { /* Second template */

    TEMPLATE_ID:'xxxxxxxx',

    PDF_FILE_NAME:'',

    RESULTS_FOLDER_ID:'xxxxxxx',

    SENT_COLUMN_NAME:'Date Sent',

    FILE_NAME_COLUMN_NAME:'File Name',

    EMAIL_COLUMN_NAME:'Email',

    DATE_FORMAT:'yyyy/MM/dd',

    DATE_TIME_FORMAT:'yyyy/MM/dd HH:mm:ss'

  }
]

传递先前准备接收相应值作为对象的参数化函数的相应对象。

参考

于 2020-06-03T19:07:05.453 回答