Получение скрипта Google Apps для авторизации Fusion Table API

создаю базу данных, которую я надеюсь разместить в Fusion Table, и яm разработка некоторых тестовых функций для взаимодействия с Fusion API. Я'я использую скрипты Google Apps и в значительной степени полагался на другие источники для этого кода. Я'Я провел большую часть дня, исследуя эту проблему, и теперь я застрял.

При запуске addNewColumn () в редакторе скриптов он попадает в "готовься запись в журнале (как я вижу в журнале), затем она проходит процесс аутентификации (каждый раз), затем просто останавливается (и никогда не попадает в "Приведи в исполнение " запись в журнале). Ошибки не выдаются, но он никогда не завершает команду fetch.

При работе в режиме отладки он проходит авторизацию, затем зависает в строке извлечения. Если я нажмушаг в Я получаю ошибку, которая просто говорит:Ошибка OAuth ", Я'Я не совсем уверен, что здесь делать. Любая помощь приветствуется.

function googleAuth() {
      var scope = "https://www.googleapis.com/auth/fusiontables";
      var service = 'fusion';
      var oAuthConfig = UrlFetchApp.addOAuthService(service);
      oAuthConfig.setRequestTokenUrl("https://www.google.com/accounts/"+
                 "OAuthGetRequestToken?scope="+scope);
      oAuthConfig.setAuthorizationUrl("https://www.google.com/accounts/OAuthAuthorizeToken");
      oAuthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");
      oAuthConfig.setConsumerKey('{consumer key}');
      oAuthConfig.setConsumerSecret('{secret}');
      return {oAuthServiceName:'fusion', oAuthUseToken:"always"};
}

function addNewColumn(){   
      var p = {
          'name' : "newColumn",
          'type' : "NUMBER"
      };

      Logger.log(addColumn(p));
}


function addColumn(parameters) {
  var url = "https://www.googleapis.com/fusiontables/v1/";
  var fetchArgs = googleAuth(); 

  fetchArgs.method = "POST";
  fetchArgs.payload = parameters;

  //if the fetch arg payload is set to null it will add an unnamed column
  //fetchArgs.payload = null;  

  url += "tables/"+"{table id}"+"/columns";
  url += '?key='+"{key}";

  Logger.log("fetch ready");

  var result = UrlFetchApp.fetch(url, fetchArgs).getContentText();

  Logger.log("fetch executed");

  return Utilities.jsonParse(result);  
}

UpateI»

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

Когда он не работает, он либо: запрашивает повторную авторизацию каждый раз, когда я запускаю его из редактора, либо при запуске из состояний веб-приложения "Обнаружена ошибка: для выполнения этого действия требуется авторизация ", Как меняется авторизация полезной нагрузки? Я'Вырезали и вставляли на игровую площадку OAuth2.0 ту же самую полезную нагрузку, и она отлично работает. Пожалуйста помоги.

function googleAuth() {
      var oAuthConfig = UrlFetchApp.addOAuthService(service);
      oAuthConfig.setRequestTokenUrl("https://www.google.com/accounts/"+
                 "OAuthGetRequestToken?scope=" + scope);
      oAuthConfig.setAuthorizationUrl("https://www.google.com/accounts/OAuthAuthorizeToken");
      oAuthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");
      oAuthConfig.setConsumerKey(clientId);
      oAuthConfig.setConsumerSecret(clientSecret);
      return {oAuthServiceName:service, oAuthUseToken:"always"};
}

function addColumn() {
  googleAuth();
  var payload = 
    {
      name : "IT WORKED",
      type : "STRING"
    };
  var options =
    {
      "oAuthUseToken":"always",
      "oAuthServiceName":service,
      "method" : "post",
      "payload":payload
    };
  var url = fetchUrl + "tables/" + fusionId + "/columns" + "?key=" + apiKey;
  var fetchResult = UrlFetchApp.fetch(url, options);
  Logger.log(fetchResult.getContentText());
  return Utilities.jsonParse(fetchResult.getContentText());
}

Обновление № 2

Я нашел способ, который позволяет ему работать без каких-либо ошибок, но он по-прежнему не назначает запрошенное имя и тип для нового столбца. Самое последнее добавление указывало тип контента, как показано ниже. Вынуждая contentType к 'приложение' или же 'JSON», он будет работать, но все еще непередать полезную нагрузку, как задумано.

  var options =
    {
      "oAuthUseToken":"always",
      "oAuthServiceName":service,
      "method" : "POST",
      "payload" : payload,
      'contentType' : 'application'
    };

Ответы на вопрос(3)

пытаясь получить и манипулировать данными из таблиц Fusion.

Там's библиотека таблиц слияния в GoogleПримечательная библиотека скриптов:https://developers.google.com/apps-script/notable-script-libraries?hl=pt-BR

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

https://sites.google.com/site/scriptsexamples/new-connectors-to-google-services/fusion-tables-class/fusion-source

Может быть, вы найдете там свои ответы.

 Scott S.15 мар. 2013 г., 07:38
На самом деле, я широко использовал эту библиотеку. К сожалению, это все еще проблема. Пожалуйста, смотрите мою обновленную (и уточненную) ветку выше. В очередной раз благодарим за помощь.
 Scott S.20 февр. 2013 г., 16:10
Благодарю. На этом сайте у меня есть некоторые мотивы, но он использует client-login и sql (что, я считаю, устарело). Я'Я все еще борюсь с ошибкой.
Причина, по которой это отличается от других примеров POST urlFetch, заключается в том, что Fusion Table Service ожидает фактическую полезную нагрузку JSON в качестве запроса "BODY», Когда вы добавляете объект JSON (без Stringify) как "полезная нагрузка»UrlFetchApp преобразует каждую пару имя / значение в строку запроса с кодировкой Url (т.е. name = YES &Тип = СТРОКА). Однако, когда Payload является String (как в вашем случае, когда вы используете stringify), UrlFetch будет просто URL-кодировать строку, которую вы предоставляете (в данном случае строку JSON). Если ты был "POSTING» для службы ожидаемые параметры имя / значение, то вы не будете использовать Stringify.Примечание: просто, чтобы вы знали и уточнить ваш другой связанный вопрос, который вы опубликовалиВот , вы используете Oauth 1.0 в этом примере (addOAuthService поддерживает только конечные точки Oauth1.0 и протоколы)Еще одно примечание: вы смешиваете Utilities.jsonParse и JSON.stringify. Я хотел бы использовать JSON.parse, чтобы быть последовательным.
Решение Вопроса

полезная нагрузка должна быть преобразована в строку с помощью JSON.stringify ()ContentType должен был быть вручную установлен на "Применение / JSON»

Это очень отличается от нескольких учебников, которые яЯ нашел в Интернете, но хотел бы поделиться своим рабочим решением.

function addColumn(authToken) {
  googleAuth();
  var payload =
    {
      name : 'YES',
      type : 'STRING'
    };
  var options =
    {
      payload : JSON.stringify(payload),
      oAuthUseToken : "always",
      oAuthServiceName : service,
      method : "POST",
      contentType : "application/json"
    };
  var url = fetchUrl + "tables/" + fusionId + "/columns";// + "?key=" + apiKey;
  var fetchResult = UrlFetchApp.fetch(url, options);
  Logger.log(fetchResult.getHeaders());
  Logger.log(fetchResult.getContentText());
  return Utilities.jsonParse(fetchResult.getContentText());

}

Ваш ответ на вопрос