Gui*_*des 3 javascript google-sheets google-apps-script graphql fetch-api
我正在尝试通过应用程序脚本从 graphql API 获取数据。
\n\n使用 POST 获取 graphql 数据存在一个问题(Providing query string to fetch from a GraphQL API),但我需要获取的 url 只允许 GET。
\n\n我写的代码如下:
\n\nfunction main() {\n var ss = SpreadsheetApp.getActiveSheet();\n url = "https://coletum.com/api/graphql?query={answer(formId:7787){answer{nomeDaEmpresa107176,cnpj107177,inscricaoEstadual107178,telefone107179},metaData{userId,userName,source,friendlyId,createdAt,createdAtDevice,createdAtCoordinates,updatedAt,updatedAtCoordinates}}}&token=k4foipsju5ckosk4w8o0w084cc8oos0"\n\n var response = UrlFetchApp.fetch(url,{method: \'GET\', headers: { \'Content-Type\': \'application/json\'} })\n\n var lists = JSON.parse((response.getContentText()));\n\n Logger.log(lists);\n}\nRun Code Online (Sandbox Code Playgroud)\n\n如果我将网址粘贴到浏览器中,一切正常:
\n\n{\n data: {\n answer: [\n {\n answer: {\n nomeDaEmpresa107176: "LAVORO",\n cnpj107177: "26.693.198/0001-20",\n inscricaoEstadual107178: 12341234,\n telefone107179: "(66) 1234-1234"\n },\n metaData: {\n userId: 9938,\n userName: "Mendes",\n source: "web_private",\n friendlyId: "1.202279",\n createdAt: "2019-05-10T00:14:54+00:00",\n createdAtDevice: "2019-05-10T00:14:54+00:00",\n createdAtCoordinates: {\n longitude: -52.20797,\n latitude: -12.58536\n },\n updatedAt: null,\n updatedAtCoordinates: {\n longitude: null,\n latitude: null\n }\n }\n },\n {\n answer: {\n nomeDaEmpresa107176: "RURAL",\n cnpj107177: "26.693.198/0001-20",\n inscricaoEstadual107178: 1234,\n telefone107179: "(66) 1234-1234"\n },\n metaData: {\n userId: 9938,\n userName: "Mendes",\n source: "web_private",\n friendlyId: "1.202280",\n createdAt: "2019-05-10T00:15:15+00:00",\n createdAtDevice: "2019-05-10T00:15:15+00:00",\n createdAtCoordinates: {\n longitude: -52.20797,\n latitude: -12.58536\n },\n updatedAt: null,\n updatedAtCoordinates: {\n longitude: null,\n latitude: null\n }\n }\n },\n {\n answer: {\n nomeDaEmpresa107176: "PRIMAVERA M\xc3\x81QUINAS",\n cnpj107177: "26.693.198/0001-20",\n inscricaoEstadual107178: 12341234,\n telefone107179: "(66) 1234-1234"\n },\n metaData: {\n userId: 9938,\n userName: "Mendes",\n source: "web_private",\n friendlyId: "1.202281",\n createdAt: "2019-05-10T00:15:51+00:00",\n createdAtDevice: "2019-05-10T00:15:51+00:00",\n createdAtCoordinates: {\n longitude: -52.20797,\n latitude: -12.58536\n },\n updatedAt: null,\n updatedAtCoordinates: {\n longitude: null,\n latitude: null\n }\n }\n },\n {\n answer: {\n nomeDaEmpresa107176: "SINAGRO",\n cnpj107177: "26.693.198/0001-20",\n inscricaoEstadual107178: 1234,\n telefone107179: "(66) 98412-1030"\n },\n metaData: {\n userId: 9938,\n userName: "Mendes",\n source: "web_private",\n friendlyId: "1.202633",\n createdAt: "2019-05-10T20:54:02+00:00",\n createdAtDevice: "2019-05-10T20:54:02+00:00",\n createdAtCoordinates: {\n longitude: -52.20629,\n latitude: -12.59418\n },\n updatedAt: null,\n updatedAtCoordinates: {\n longitude: null,\n latitude: null\n }\n }\n }\n ]\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n但是在应用程序脚本中使用 Url Fetch 时出现错误:
\n\n"Invalid Argument: https://coletum.com/api/graphql?query={answer(formId:7787){answer{nomeDaEmpresa107176,cnpj107177,inscricaoEstadual107178,telefone107179},metaData{userId,userName,source,friendlyId,createdAt,createdAtDevice,createdAtCoordinates,updatedAt,updatedAtCoordinates}}}&token=k4foipsju5ckosk4w8o0w084cc8oos0 (line 5, file "C\xc3\xb3digo")"\nRun Code Online (Sandbox Code Playgroud)\n\n我需要做什么才能让我的代码正常工作?
\n解决方案是在获取之前对 url 进行编码:
function main() {
var ss = SpreadsheetApp.getActiveSheet();
url_orcamentos = "https://coletum.com/api/graphql?query={answer(formId:7787){answer{nomeDaEmpresa107176,cnpj107177,inscricaoEstadual107178,telefone107179},metaData{userId,userName,source,friendlyId,createdAt,createdAtDevice,createdAtCoordinates,updatedAt,updatedAtCoordinates}}}&token=k4foipsju5ckosk4w8o0w084cc8oos0"
url = encodeURI(url_orcamentos)
var response = UrlFetchApp.fetch(url,{method: 'GET', headers: { 'Content-Type': 'application/json'} })
var lists = JSON.parse((response.getContentText()));
Logger.log(lists);
}
Run Code Online (Sandbox Code Playgroud)