Разрешают ли сценарии Google Apps какой-либо самоанализ?

  1. Может ли скрипт Google Apps узнать свое собственное имя? или его id?

  2. Может ли он получить идентификатор содержащей его папки?

  3. Может ли он узнать, где он находится в иерархии папок?

  4. Может ли скрипт «А» получить/установить свойства скрипта «Б»?

  5. Может ли сценарий «А» редактировать какие-либо аспекты библиотек, используемых сценарием «Б»?

  6. Может ли сценарий «А» опубликовать сценарий «Б»?

  7. Может ли сценарий «А» изменить текст сценария «Б»?

Обновление 03.10.2014, 16:00 по восточному поясному времени

  1. Может ли сценарий «А» управлять версиями сценария «Б»?

  2. Может ли сценарий «А» сделать с собой любое из 5, 6, 7 или 8 действий?


person Martin Bramwell    schedule 03.10.2014    source источник
comment
Я только что заметил, что добавил несколько дополнительных деталей, но в остальном продублировал этот вопрос stackoverflow.com/questions/13642281/.   -  person Martin Bramwell    schedule 03.10.2014
comment
может слишком много вопросов в одном посте? ты не думаешь? ;-)   -  person Serge insas    schedule 03.10.2014


Ответы (2)


  1. Может ли скрипт Google Apps узнать свое собственное имя? или его идентификатор?

Не как таковой. Обычной практикой является создание в скрипте глобальной константной строки, содержащей собственный идентификатор. С идентификатором вы можете получить имя файла сценария с помощью

var SCRIPT_ID = 'abcdefghijklmnopqrstuvwxyz0123456789'; // Constant
...
var scriptFileName = DriveApp.getFileById(SCRIPT_ID).getName();

И наоборот, если у вас есть имя файла сценария, вы можете получить его идентификатор, используя DriveApp.getFilesByName(name), а затем вызывая getId() для файловых объектов. Однако, поскольку несколько файлов могут иметь одно и то же имя, вам необходимо учитывать возможность дублирования.

Обратите внимание, что ScriptApp.getService().getUrl() вернет null, если сценарий не развернут как веб-приложение, и в этом случае он вернет URL-адрес интерфейса веб-приложения, а не сам файл сценария.

  1. Может ли он получить идентификатор содержащей его папки?

Да. Однако важно помнить, что файлы на Диске могут находиться в нескольких папках и, следовательно, иметь несколько родителей.

function getScriptParent() {
  var thisScript = DriveApp.getFileById(myId);
  var parents = thisScript.getParents();
  while (parents.hasNext()) {
    var folder = parents.next();
    Logger.log(folder.getId());
  }
}
  1. Может ли он узнать, где он находится в иерархии папок?

Можно проследить путь файла обратно к корню, найдя родителей каждой папки-предка. Однако, опять же, у каждого файла и папки на Диске может быть несколько родителей, поэтому найти пути не так просто. Если у вас есть только один допустимый путь, вы можете просто взять первого родителя каждого файла/папки и сделать шаг назад. Если вам нужны все действительные пути, вам, вероятно, потребуется реализовать BFS или DFS, чтобы найти и записать их все.

  1. Может ли сценарий "А" получить/установить свойства сценария "Б"?

Невозможно получить доступ к ScriptProperties скрипта из другого скрипта. Если вы хотите отправлять данные между сценариями, лучше всего использовать какое-либо внешнее хранилище данных, например базу данных SQL, доступ к которой осуществляется через JDBC.

  1. Может ли сценарий "А" редактировать какие-либо аспекты библиотек, используемых сценарием "Б"?

Если вы спрашиваете, может ли сценарий А изменить библиотеки, включаемые сценарием Б, то нет, это невозможно. Сценарий B также не может программно изменить используемые им библиотеки — этот выбор необходимо сделать в интерфейсе редактора сценариев.

  1. Может ли сценарий "А" опубликовать сценарий "Б"?

No.

  1. Может ли сценарий "А" изменить текст сценария "Б"?

No.

  1. Может ли сценарий "А" управлять версиями сценария "Б"?

No.

  1. Может ли скрипт "А" сделать с собой любое из действий 5, 6, 7 или 8?

В основном нет — программно можно управлять только деполированием веб-приложений. Сценарий может управлять собственным развертыванием в качестве веб-приложения с помощью ScriptApp.Service методы. См. ScriptApp.Service.enable(restriction) метод для получения дополнительной информации.

person Ryan Roth    schedule 20.10.2014
comment
Действительно отличный подробный ответ. Спасибо. Я задал вопрос после того, как исчерпал все возможности, чтобы найти способ управлять сценариями из сценариев. Итак, вы с Сержем подтвердили мое понимание. Спасибо, что приложили усилия, чтобы все это изложить. - person Martin Bramwell; 21.10.2014

Несколько ссылок, чтобы ответить на некоторые из ваших (многочисленных) вопросов: (если я подумаю о других элементах ответа, я обновлю)


чтобы получить собственный URL скрипта: ScriptApp.getService().getUrl()


чтобы прочитать содержимое скрипта Google Apps из другого скрипта: Можно ли прочитать содержимое скрипта Google Apps из другого скрипта

ScriptApp.getResource("Code").getDataAsString();


чтобы найти путь к папке, в которой находится текущий файл сценария:

function getScriptFolderTree() {
  var thisScript = getThisScriptInDrive();
  var names = []
  var Ids = []
  var folder = thisScript.getParents()[0];
  while (folder.getName() != "Root"){
      names.unshift(folder.getName());
      Ids.unshift(folder.getId());
    var parents = folder.getParents();
       var folder = parents[0];
  }
Logger.log('Root/'+names.join().replace(/,/g,'/'))  
Ids.unshift(DocsList.getRootFolder().getId())
Logger.log(Ids)  
}


function getThisScriptInDrive() {
  return DocsList.find("poiuytrezazertyujhgfdsdcvcxyydryfhchfh")[0];
}

Заимствовано из этого сообщения (оригинальный ответ Кори Г + мой пример разработки)


(должен быть завершен...)

person Serge insas    schedule 03.10.2014