Передача параметров в скрипт приложения - PullRequest
0 голосов
/ 02 октября 2018

На основе https://www.plivo.com/blog/Send-templatized-SMS-from-a-Google-spreadsheet-using-Plivo-SMS-API/ У меня есть следующий код:

data = {
    "SOURCE" : "+1234567890",
    "DESTINATION" : "+2345678901",
    "FIRST_NAME" : "Jane",
    "LAST_NAME" : "Doe",
    "COUPON" : "DUMMY20",
    "STORE" : "PLIVO",
    "DISCOUNT" : "20",
}

template_data = "Hi   FIRST_NAME , your coupon code for discount of % purchase at  is "

function createMessage(data,template_data){
  Logger.log(data);

  for (var key in data) {
    Logger.log(key);

    if (data.hasOwnProperty(key)) {
      template_data = template_data.replace(new RegExp('+key+', 'gi'), data[key]);
    }
  }
  Logger.log(template_data);
  return template_data;
}

Когда я запускаю createMessage и проверяю логи, которые я вижу:

[18-10-02 13:19:03:139 EDT] undefined
[18-10-02 13:19:03:139 EDT] undefined

Это говорит о том,мне, что параметры не передаются в функцию.Что я делаю не так?

1 Ответ

0 голосов
/ 02 октября 2018

Запуск функции в редакторе сценариев не передает аргументы функции.В настоящее время у вас есть 3 пользовательских объекта в глобальном пространстве имен вашего проекта (в том числе из Google):

  • createMessage (объект функции)
  • template_data (строка)
  • data (объект).

Строка function createMessage(data, template_data) объявляет объект createMessage как функциональный объект и указывает, что первые два аргумента, переданные функции, известны в области действия функции какdata и template_data соответственно.Эти объявления аргументов области действия функции скрывают любые более отдаленные объявления (т. Е. От глобальной области видимости или области действия включающей функции).

Решение состоит в том, чтобы либо написать «функцию драйвера», которую вы фактически выполняете, в которой выОпределите входные параметры для вызываемых вами функций или удалите параметры из вызова функции:

var data = {...}; // global var
var template_data = {...}; // global var
function driver() {
  createMessage(data, template_data); // uses the globally scoped `data` & `template_data` objects
  var otherdata = 1,
      otherTemplate = 2;
  createMessage(otherdata, otherTemplate); // uses the function-scoped `otherdata` and `template_data` objects
}
function createMessage(someData, someTemplate) {
  Logger.log(someData);
  Logger.log(arguments[0]); // equivalent to the above line.
  // ...
}

Как избежать затенения ссылок:

function createMessage() { // removed `arguments` reference binding
  Logger.log(data);  // accesses global-scope `data` object because there is no `data` reference in the nearest scope

Чтобы помочь в этом сценарии - предотвращение ручного выполнениячерез редактор сценариев функций, нуждающихся в параметрах. Обычно я делаю функции приватными, добавляя к имени трейлинг _: function cantBeRunManually_(arg1, arg2, arg3) { ... }

Ссылки:

...