0

Я разрабатываю функцию сценария приложений Google, которая вставляет строку в таблицу слияния. Большая часть моего интерфейса таблицы fusion работает отлично, но это моя первая попытка запроса sql 'POST'. Основываясь на документации here Я должен был бы разместить инструкцию sql внутри тела POST. Я сократил себя до OAuth Playground для устранения неполадок, и я продолжаю получать следующую ошибку. Я пытался использовать инструкцию вставки sql sql=INSERT INTO {fusionId} (HeadingName) VALUES (ValueOne), и я пробовал различные варианты этого утверждения безрезультатно. Пожалуйста, помогите мне определить правильный синтаксис или метод для этого.OAuth, OAuthConfig и скрипт Google Apps (API таблицы Fusion - проблемы с вставкой SQL)

{ 
"error": { 
    "errors": [ 
    { 
    "domain": "global", 
    "reason": "required", 
    "message": "Required parameter: sql", 
    "locationType": "parameter", 
    "location": "sql" 
    } 
    ], 
    "code": 400, 
    "message": "Required parameter: sql" 
} 
} 

После того, как я понять это, я тогда нужно дублировать работу площадка в моем коде, который (я думаю) будет выглядеть примерно так:

function fusionRequest(methodType, sql, oAuthFields) { 
    OAL.googleAuth(oAuthFields); 
    var options = 
    { 
     oAuthUseToken : "always", 
     oAuthServiceName : 'fusiontables', 
     method : "POST", 
     payload : "sql=INSERT INTO {fusionId} (Heading) VALUES (ONE)", 
     contentType : "application/json" 
    }; 
Logger.log(options) 
    var fetchResult = UrlFetchApp.fetch(oAuthFields.queryUrl, options); 
    return JSON.parse(fetchResult.getContentText()); 
} 

Я думал, что мог также проблема с типом контента, но я в недоумении. Пожалуйста помоги.

Обновление # 1 Используя совет Саньи, я смог получить запрос, работающий на игровой площадке OAuth. Тем не менее, я все еще борюсь с запросом в коде. Я получаю повторяющиеся запросы на авторизацию при запуске кода (или общую ошибку OAuth при отладке). Из моего предыдущего опыта here, я считаю, это означает, что с моей полезной нагрузкой все еще что-то не так. Любые советы по этому поводу будут высоко оценены.

var oAuthFields = { 
    'clientId' : '523606257547.apps.googleusercontent.com', 
    'scope' : 'https://www.googleapis.com/auth/fusiontables', 
    'fetchUrl' : 'https://www.googleapis.com/fusiontables/v1/', 
    'clientSecret' : 'L-f8DgwK4rs7Qmw9k5IFL7lZ', 
    'fusionId' : '1b4kT_aYRfNBy8ZPtSZqhQUqVSVIYj_QWiBmjXXI', 
    'service' : 'fusiontables', 
    'queryUrl' : 'https://www.googleapis.com/fusiontables/v1/query/' 
}; 
function fusionRequest(methodType, sql, oAuthFields) { 
    OAL.googleAuth(oAuthFields); 
    var options = 
    { 
     oAuthUseToken : "always", 
     oAuthServiceName : 'fusiontables', 
     method : "POST", 
     payload : "sql=INSERT INTO {fusion id} (\'Heading\') VALUES (\'ONE\')", 
     contentType : "application/x-www-form-urlencoded" 
    }; 
    var fetchResult = UrlFetchApp.fetch(oAuthFields.queryUrl, options); 
    return JSON.parse(fetchResult.getContentText()); 
} 

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

ответ

0

УСПЕХА! После многих исследований я решил проблему. Это не проблема с полезной нагрузкой или contentType (на самом деле я обнаружил, что .fetch автоматически по умолчанию используется для кодировки «application/x-www-form-urlencoded»). Вопрос был в разрешении. Я использовал библиотеку таблиц Fusion Table Джеймса Феррейры в качестве модели и вставил Logger.log(UrlFetchApp.getRequest(url, fetchArgs)) перед UrlFetchApp.fetch(url, fetchArgs).getContentText() как в моем коде, так и в библиотеке.

//log entry for library 
{oAuthServiceName=fusion, useIntranet=false, followRedirects=true, oAuthUseToken=always, payload=sql=INSERT INTO 1b4kT_aYRfNBy8ZPtSZqhQUqVSVIYj_QWiBmjXXI ('Heading', 'Heading 2') VALUES ('NONE','TWO'), method=POST, validateHttpsCertificates=true, contentType=application/x-www-form-urlencoded, url=https://www.google.com/fusiontables/api/query} 

//log entry for my code 
{oAuthServiceName=fusiontables, useIntranet=false, followRedirects=true, oAuthUseToken=always, payload=sql=INSERT+INTO+1b4kT_aYRfNBy8ZPtSZqhQUqVSVIYj_QWiBmjXXI+('Heading',+'Heading+2')+VALUES+('NONE','TWO'), method=POST, validateHttpsCertificates=true, contentType=application/x-www-form-urlencoded, url=https://www.googleapis.com/fusiontables/v1/query} 

Затем я сравнил журнал рабочей библиотеки с моим собственным и нашел три отличия.

  1. Что я думаю о различии в кодировке для оператора sql ("INSERT INTO" vs. "INSERT + INTO").
  2. Параметр «service» запроса был другим («fusion» vs. «fusiontables»).
  3. URL-адрес запроса qpi был другим. ("Www.google.com/fusiontables/api/query" против «www.googleapis.com/fusiontables/v1/query).

После нескольких экспериментов, я решил, что ...

  1. Воображаемый кодирования не имеет отношения к моей ошибке.
  2. параметр службы также не имеет значения. Я видел, как в различных документов и либо один, кажется, работает.
  3. Разочаровывающе, это был вопрос. это разочарование, потому что api documentation говорит, что использует тот, который НЕ РАБОТАЕТ. По-видимому, www.googleapis.com/fusi ontables/v1/query используется для OAuth2.0. OAuthConfig (инструмент авторизации bult-in, который я использую в GAS) не был перенесен на 2.0, поэтому произошла ошибка в документации. Я отправил запрос функции для переноса OAuthConfig here. Пожалуйста, дайте этой теме некоторую любовь, если вы также хотите, чтобы ее рассматривали.
2

Документация неисправна и некоторые детали отсутствуют.

Вы можете использовать параметр sql = ... в запросе url. Заголовок ContentType обычно является application/json, но API, вероятно, также принимает другие ContentTypes. В этом случае вы ограничены длиной URL-адресов 2048 символов.

Вы также можете использовать sql = ... в корпусе POST. В этом случае вы должны установить ContentType должен быть application/x-www-form-urlencoded. Вы ограничены 500 инструкциями INSERT в 1 запросе.

Другой вариант - использовать метод importRows. Здесь вы будете использовать CSV как тело POST. В этом методе вы ограничены загруженными данными на 100 МБ. ContentType должен быть «application/octet-stream». Будьте осторожны: URL-адрес отличается от указанного выше: https://www.googleapis.com/upload/fusiontables/v1/tables/tableId/import. Кроме того, если вы предоставите не являющиеся UTF-8 символов в организме вы должны дать & кодирования = параметр ... URL Подробнее здесь: importRows reference

+0

Благодарим вас за подробный ответ. Изменив кодировку, я смог получить запрос, работающий на игровой площадке OAuth, но он все еще дает мне проблемы в коде. Я получаю повторяющиеся запросы на авторизацию при запуске кода (или общую ошибку OAuth при отладке). Я считаю, что это означает, что с моей полезной нагрузкой все еще что-то не так. Помогите? (см. обновление выше). –

+0

если вы создадите скрипку, я могу помочь. не принимайте это как должное. oauth отчасти трудно отлаживать. если вы его работаете на спортивной площадке oauth, тогда ничего плохого в вашей полезной нагрузке. ваша аутентификация может быть неисправна, хотя .. – sanya

Смежные вопросы