Я пытаюсь создать диаграмму на основе данных из листов Google. После долгой борьбы и прочтения здесь множества тем я все еще не смог передать свои данные в javascript в моем html-файле, который будет использоваться для диаграммы.
Я поместил следующий код в свой проект code.gs в редакторе скриптов Google:
function doGet(e){
return handleResponse(e);
}
function doPost(e){
return handleResponse(e);
}
function handleResponse(e) {
var lock = LockService.getPublicLock();
lock.waitLock(2000); // wait 5 seconds before conceding defeat.
try {
var SCRIPT_PROP = PropertiesService.getScriptProperties(); // new property service
// get the chart data to pass through to front-end
var doc = SpreadsheetApp.openById("HERE IS MY SPREADSHEET ID");
var sheet = doc.getSheetByName("TestSheet");
var headings = sheet.getRange(1,1,1,sheet.getLastColumn()).getValues()[0].map(function(heading) {
return heading.toLowerCase();
});
Logger.log(headings);
var values = sheet.getRange(2, 1, sheet.getLastRow()-3, sheet.getLastColumn()).getValues();
var data = [];
for (var i=0; i < values.length; i++) {
var obj = {};
for (var j = 0; j < values[i].length; j++) {
obj[headings[j]] = values[i][j];
}
data.push(obj);
}
Logger.log(data);
return data;
} catch(e){
// if error return this
return ContentService
.createTextOutput(JSON.stringify({"result":"error", "error": e}))
.setMimeType(ContentService.MimeType.JSON);
} finally { //release lock
lock.releaseLock();
}
}
Это дает следующую стенограмму выполнения:
[18-04-12 20:23:51:233 PDT] Starting execution
[18-04-12 20:23:51:288 PDT] Lock.waitLock([2000]) [0.046 seconds]
[18-04-12 20:23:51:290 PDT] PropertiesService.getScriptProperties() [0.001
seconds]
[18-04-12 20:23:51:407 PDT]
SpreadsheetApp.openById([HERE IS MY SPREADSHEET ID])
[0.116 seconds]
[18-04-12 20:23:51:408 PDT] Spreadsheet.getSheetByName([TestSheet]) [0
seconds]
[18-04-12 20:23:51:707 PDT] Sheet.getLastColumn() [0.299 seconds]
[18-04-12 20:23:51:708 PDT] Sheet.getRange([1, 1, 1, 2]) [0 seconds]
[18-04-12 20:23:51:808 PDT] Range.getValues() [0.099 seconds]
[18-04-12 20:23:51:810 PDT] Logger.log([[actor, income], []]) [0 seconds]
[18-04-12 20:23:51:906 PDT] Sheet.getLastRow() [0.095 seconds]
[18-04-12 20:23:52:004 PDT] Sheet.getLastColumn() [0.098 seconds]
[18-04-12 20:23:52:006 PDT] Sheet.getRange([2, 1, 3, 2]) [0.001 seconds]
[18-04-12 20:23:52:006 PDT] Range.getValues() [0 seconds]
[18-04-12 20:23:52:008 PDT] Logger.log([[{actor=Robert Downey, income=80.0},
{actor=Jackie Chan, income=50.0}, {actor=Vin Diesel, income=47.0}], []]) [0
seconds]
[18-04-12 20:23:52:073 PDT] Lock.releaseLock() [0.065 seconds]
[18-04-12 20:23:52:075 PDT] Execution succeeded [0.834 seconds total
runtime]
Таким образом, сторона листа Google, похоже, работает и развернута как webapp. У меня также есть еще одна аналогичная функция для передачи данных на другой лист, и она работает нормально (другой код, конечно, в другом проекте скрипта Google).
Когда я вызываю этот макрос из своего файла сценария, как показано ниже:
var request;
console.info("before execute");
window.onload = callGoogleScript;
function callGoogleScript() {
request = $.ajax({
crossDomain: true,
url: "https://script.google.com/macros/s/MY MACRO ID/exec",
type: "get",
dataType: "jsonp",
});
console.info("Trying this:", request);
request.done(function (response, textStatus, jqXHR){
// Log a message to the console
console.info("Hooray, it worked!");
console.info(response);
console.info(textStatus);
console.info(jqXHR);
});
console.info("After execute");
}
Выполнение не появляется в журналах скриптов Google, и я получаю следующее сообщение об ошибке в консоли Chrome:
before execute
results.html:96 Trying this: {readyState: 1, getResponseHeader: ƒ,
getAllResponseHeaders: ƒ, setRequestHeader: ƒ, overrideMimeType: ƒ, …}
results.html:105 After execute
results.html:1 Refused to execute script from
'https://script.google.com/macros/s/HERE IS MY MACRO ID/exec?
callback=jQueryXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' because its MIME type
('text/html') is not executable, and strict MIME type checking is enabled.
Не могли бы вы помочь мне решить, какой здесь недостающий ключ? Я пробовал несколько решений из других потоков, но, похоже, не могу заставить работать даже простой сценарий чтения. Спасибо заранее!
Не уверен, как именно это сделать ... Уже пробовали несколько методов для вывода данных в формате JSON, но безуспешно ... Не могли бы вы помочь мне с кодом, чтобы "возвращаемые данные" были в JSON?
Я изменил последнюю часть скрипта Google «возвращать данные», чтобы вернуть ContentService .createTextOutput (JSON.stringify (data)) .setMimeType (ContentService.MimeType.JSON); и в стенограмме выполнения я вижу следующее: [18-04-14 08: 30: 17: 118 HKT] TextOutput.setMimeType ([JSON]) [0 секунд] Однако я все еще получаю ту же ошибку MIME в консоли Chrome, когда пытаюсь вызвать скрипт Google
Я снова изменил вывод Google: return ContentService.createTextOutput (JSON.stringify (values)) .setMimeType (ContentService.MimeType.JSON); после чего в журнале выполнения написано: ContentService.createTextOutput ([[[80], [50], [47], [41.5], [41] , [99], [""]]]) [0 секунд] [18-04-16 00: 03: 11: 193 PDT] TextOutput.setMimeType ([JSON]) [0 секунд] НО ВСЕ ЕЩЕ вызов AJAX-запроса (datatype = JSONP) возвращает ошибку MIME ... любая подсказка, как это получить простая строка поверх?
Я предполагаю, что мой вопрос дошел до того, что JSON - это не JSONP - это два разных, но связанных типа данных. Если вы выводите JSON и ожидаете JSONP, может быть, в этом проблема?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы уверены, что возвращаемый тип данных - это jsonp?