2013-02-20 2 views
1

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

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

При запуске в режиме отладки он проходит авторизацию, а затем зависает в строке выборки. Если я нажму «step-in», я получаю сообщение об ошибке «OAuth Error». Я не совсем уверен, что делать здесь. Любая помощь приветствуется.

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); 
} 

Upate

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

Когда он не работает, он либо: требует повторного авторизации при каждом запуске его из редактора, либо при запуске из веб-приложения говорится: «Ошибка: авторизация необходима для выполнения этого действия». Как разрешение на изменение полезной нагрузки? Я вырезал и вставил ту же самую полезную нагрузку в игровую площадку 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()); 
} 

Update # 2

Я нашел способ, который позволяет запустить его без каких-либо ошибок, но он по-прежнему не назначает запрошенное имя и тип для нового столбца. Последнее добавление указывало тип содержимого, как показано ниже. Заставляя contentType на «приложение» или «json», он будет работать, но все равно не передает полезную нагрузку, как предполагалось.

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

ответ

0

РЕШЕННЫЙ !!! Решение было двояким:

  1. полезная нагрузка должна была быть преобразована в строку через JSON.stringify()
  2. 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()); 

} 
0

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

Там в сводной таблице библиотека в заметному библиотеки сценариев 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

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

+0

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

+0

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

0
  • Причина, по которой это представляется другим, что другие UrlFetch POST примеры, потому что таблицы Fusion Service ожидает фактический JSON полезную нагрузку в качестве запроса «ТЕЛО». Когда вы добавляете объект JSON (без Stringify) в качестве «полезной нагрузки», UrlFetchApp преобразует каждую пару имен/значений в строку запроса с кодировкой URL (т. Е. Имя = ДА & type = STRING). Однако, когда Payload является строкой (как в вашем случае, когда вы используете stringify), UrlFetch будет только URL-кодировать строку, которую вы предоставляете (в этот случай - строка JSON). Если вы были «POSTING» для сервиса ожидаемых параметров имени/значения, то вы не будете использовать Stringify.
  • Примечание: Только так вы знаете и уточнить ваш другой родственный вопрос, который отвечал here, вы используете OAuth 1.0 в этом примере (addOAuthService поддерживает только Oauth1.0 Endpoints и протоколов)
  • еще одно замечание : Вы смешиваете Utilities.jsonParse и JSON.stringify. Я бы использовал JSON.parse, чтобы быть последовательным.
Смежные вопросы