Google Apps Script Add On google.run.script работает как разработчик? - PullRequest
0 голосов
/ 15 сентября 2018

Я работаю в ГАЗе чуть меньше 6 месяцев. Все до сих пор было связано с электронными таблицами проектов, но создало немало. У меня есть новая потребность создать дополнительную боковую панель, которую люди могут использовать в любой электронной таблице, которую они хотят (в домене). Я создал код, опубликовал его, чтобы его мог видеть только домен, и смог установить его как другого пользователя в том же домене. Все это работает нормально.

Проблема связана с sidebar.html и вызовом функции в моем скрипте с использованием google.script.run для вызова функции, которая получает некоторые внешние данные и записывает их на текущий лист. Весь код для получения внешних данных работает просто отлично, все это входит в двухмерный массив. Часть, где это сломается, находится в SpreadsheetApp.getActiveSpreadsheet().getActiveSheet().getRange(1,1,x,y).setValues(array). Я получаю «У вас нет прав доступа к запрошенному документу» .

Во время тестирования я выполнил следующее:

1) Сценарий для надстройки начинался как связанный скрипт с существующим листом для разработки. Подумав, что это может быть проблемой, я заново создал проект как отдельный GAS и опубликовал его как веб-дополнение для листов. Это не имело значения.

2) Разработчик может запустить дополнение просто без ошибок на боковой панели.

3) Я создал еще один пункт меню для надстройки, который вместо того, чтобы открывать боковую панель и позволять боковой панели вызывать функцию через google.script.run, запускает функцию прямо из меню. Делая это таким образом, он «работает» для другого пользователя домена (если он не запускает его с боковой панели).

4) Я «поделился» основным Листом Google, который я использовал для тестирования надстройки с тестовым пользователем домена, с разработчиком, и тогда будет работать скрипт боковой панели. Если я использую надстройку на другом листе без общего доступа, я получаю ошибку разрешения.

5) Если я использую его на листе в большой общей папке на диске, которую мы все используем и имеем доступ к ней (для всего домена), она работает нормально, как и следовало ожидать от теста в «3» выше.

Большие вопросы:

Похоже, что google.script.run работает как разработчик, и не как текущий пользователь (на клавиатуре)? Это правильно? Ищу в документы вроде this , я не смог найти ничего, что указывало бы тот. Что-то, что я должен добавить, чтобы убедиться, что это работает? Это побочный эффект от того, как я его публикую, только для использования домена?

Обновление: не идентифицировав одно из них, я протестировал чье-то дополнение 'Найти и заменить', и, конечно же, оно может записывать с боковой панели прямо на лист без каких-либо проблем. Единственное, что я сделал, - это авторизовал приложение, когда я его установил. Так что это вполне возможно. Я просто пытаюсь выяснить, чего мне не хватает в моем дополнении, что позволит мне сделать то же самое.

Вот небольшой пример, который я собрал, чтобы проверить «запись» массива из 2 столбцов и 2 строк в A1: B2 на текущем активном листе. Он работает как из меню и боковой панели, как разработчик. Он всегда работает из меню как пользователь домена, но будет «работать» только на боковой панели, если у разработчика есть прямые права доступа к файлу (либо через одноразовый общий ресурс, либо через создание в ранее общей папке, которую разработчик имеет соответствующие разрешения для).

// scopes
https://www.googleapis.com/auth/script.container.ui
https://www.googleapis.com/auth/spreadsheets

// code.gs
function onOpen(e) {
  SpreadsheetApp.getUi().createAddonMenu()
 .addItem('Sidebar Test', 'showSidebar')
 .addItem('setValues Test', 'setValuesTest')
 .addToUi();
}

function showSidebar() {
  var htmlTemplate = HtmlService.createTemplateFromFile('sidebar');
  var ui = htmlTemplate.evaluate()
    .setTitle('Sidebar Test')
  SpreadsheetApp.getUi().showSidebar(ui);
}

function onInstall(e) {
  onOpen(e);
}

function setValuesTest() {
  try {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var sheet = ss.getActiveSheet();
    var valArr = [];
    valArr.push([1,2]);
    valArr.push([3,4]);
    sheet.getRange(1, 1, 2, 2).setValues(valArr);
  } catch (e) {
    throw new Error(errorMessage({e: e}));
  }
}

function errorMessage(params) {
  return params.e.message + '<br/><div class="main">file: '+ 
    params.e.fileName+'<br/>line: '+ params.e.lineNumber + '</div>';
}

function getVersion() {
  var scriptProps = PropertiesService.getScriptProperties();
  return scriptProps.getProperty('Version');
}

// utility.gs
function include(filename) {
  return HtmlService.createHtmlOutputFromFile(filename)
      .getContent();
}

// sidebar.js.html
<script>
$(function() {
  $('#run-query').click(runQueryButton);
});

function runQueryButton() {
  runQuery(this);
}

function runQuery(element) {
  element = (element === 'undefined') ? this : element;
  element.disabled = true;
  $('#error').remove();
  google.script.run
    .withSuccessHandler(
      function(msg, element) {
        element.disabled = false;
      })
    .withFailureHandler(
      function(msg, element) {
        showError(msg, $('#main'));
        element.disabled = false;
      })
    .withUserObject(element)
    .setValuesTest();
  google.script.host.editor.focus();
}

function showError(msg, element) {
  var div = $('<div id="error" class="error">' + msg + '</div>');
  $(element).after(div);
}
</script>

// sidebar.html
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
    <?!= include('sidebar.css'); ?>
  </head>
  <body>
    <div class="sidebar branding-below">
      <div id="main" >
        <button class="blue cursor-pointer" id="run-query" data-toggle="modal">Execute</button>
      </div>
    </div>
    <div class="sidebar bottom">
      Version: <?!= getVersion(); ?>
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <?!= include('sidebar.js'); ?>
  </body>
</html>

// sidebar.css.html
<style>
.error {
  padding: .25em .25em;
  font-family: Arial,sans-serif;
}
</style>

Обновление 2 Я изменил тип развертывания на «Только доверенные тестеры» и добавил в качестве тестера свое собственное имя, не относящееся к домену. Я отправил свою (другую) ссылку на приложение и установил ее оттуда. Ответили на всплывающее окно авторизации (хотя, так как я не в домене, мне пришлось идти по небезопасному маршруту, и это нормально). Запустил тестовый аддон ... и он работал как чемпион! Теперь и я (не домен), и другие разработчики (домен) заплатили 5 долларов. Это проблема? Является ли проблема в том, что тестовый пользователь, которого я создал «в» домене, не заплатил денег, поэтому он не будет работать?

Для меня это не имеет особого смысла, так как тестовое дополнение устанавливается, и тестовый пользователь (в домене) может вызывать базовый скрипт из «меню», и он просто отлично заполняет электронную таблицу.Он отключается только для пользователя домена, когда он пытается запустить приложение из боковой панели, которая вызывает код с помощью вызова google.script.run.Это действительно, очень странно и расстраивает.

С другой стороны, я добавил функцию, показывающую «эффективного пользователя» на боковой панели, на случай, если на этом фронте произойдет что-то странное, ивсе выглядит хорошо, сообщая имя тестового пользователя в домене, а не имя разработчика в домене.

Полагаю, мое следующее тестирование будет:

  1. Переверните его обратно в домен, переустановите для тестового пользователя домена, посмотрите, не случилось ли что-то еще, чтобы исправить это.

  2. Если все еще не работает, переверните его обратно вдоверенные тестеры, добавьте тестового пользователя домена в эту группу, заплатите еще $ 5 и посмотрите, смогут ли они установить и запустить его таким способом.Если они могут, значит, что-то либо содержит недостатки в публикации дополнений в домене, либо мне не хватает какой-либо документации (или чего-то недокументированного).

1 Ответ

0 голосов
/ 15 сентября 2018

google.script.run всегда будет работать как эффективный пользователь надстройки (который может быть, а может и не быть разработчиком).

Однако, если пользователю не предоставлено разрешение на редактирование электронной таблицы, у вас будут ошибки.

Вы можете попробовать настроить командный диск для своего домена, чтобы документы могли легко обмениваться с пользователями в команде.В качестве альтернативы вы можете создать общую папку (с правами редактирования) для всех пользователей в вашем домене для хранения документов, которые должны быть доступны всем пользователям в указанном домене.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...