我创建了一个简单的angularjs网站。我的后端是谷歌表,不理想,但它是免费的。我已将以下脚本部署为webapp以从我的google工作表中获取JSON :(这不是我的代码btw)
function doGet(request) {
var output = ContentService.createTextOutput();
var data = {};
var id = request.parameters.id;
var sheet = request.parameters.sheet;
var cell = request.parameters.cell;
var ss = SpreadsheetApp.openById(id);
if (sheet) {
if (cell) {
data = ss.getSheetByName(sheet).getRange(cell).getValue();
} else {
data[sheet] = readData_(ss, sheet);
}
} else {
// Grab all sheets except those with a name
// that starts with an underscore
ss.getSheets().forEach(function(oSheet, iIndex) {
var sName = oSheet.getName();
if (! sName.match(/^_/)) {
data[sName] = readData_(ss, sName);
}
})
}
var result = cell ? data : JSON.stringify(data);
var callback = request.parameters.callback;
if (callback == undefined) {
output.setContent(result);
output.setMimeType(cell ? ContentService.MimeType.TEXT : ContentService.MimeType.JSON);
}
else {
output.setContent(callback + "(" + result + ")");
output.setMimeType(ContentService.MimeType.JAVASCRIPT);
}
return output;
}
function readData_(ss, sheetname, properties) {
if (typeof properties == "undefined") {
properties = getHeaderRow_(ss, sheetname);
properties = properties.map(function(p) { return p.replace(/\s+/g, '_'); });
}
var rows = getDataRows_(ss, sheetname);
var data = [];
for (var r = 0, l = rows.length; r < l; r++) {
var row = rows[r];
var record = {};
for (var p in properties) {
record[properties[p]] = convert_(row[p]);
}
data.push(record);
}
return data;
}
function convert_(value) {
if (value === "true") return true;
if (value === "false") return false;
return value;
}
function getDataRows_(ss, sheetname) {
var sh = ss.getSheetByName(sheetname);
return sh.getRange(2, 1, sh.getLastRow() - 1, sh.getLastColumn()).getValues();
}
function getHeaderRow_(ss, sheetname) {
var sh = ss.getSheetByName(sheetname);
return sh.getRange(1, 1, 1, sh.getLastColumn()).getValues()[0];
}
在我的角度应用中,我有一个简单的服务,使用角度http来访问webapp及其网址和电子表格的ID:
app.service('GoogleSheets', function($http) {
return {
getSheet: function(url, id) {
return $http({
url: url,
method: 'GET',
params: {id: id}
}).then(function(data) {
return data.data;
});
}
};
});
这适用于Chrome,Opera,Firefox和Microsoft Edge。但是,当我尝试在Safari上使用它时,我收到以下错误:
XMLHttpRequest cannot load http://<MYSERVERADDRESS>/WebMethods.asmx/Method. Cannot make any requests from null
经过一番研究后,我发现这是因为safari处理CORS的方式。我读了一个问题,提到改变涉及Allow-Access-Control-Origin的标题,但我不知道如何做到这一点。这种事情只是Safari不支持的东西还是我可以做的事情?我知道可以将我的电子表格页面划分为单独的文件,并使用简单的get请求访问它们然后解析html,但这更笨重,我希望避免这种情况。