CORS错误:由于CORS政策,请求已被阻止

时间:2020-09-30 08:14:24

标签: google-apps-script google-sheets cors postman

我正在编写脚本以将数据发布到电子表格,但是在Postman上测试该脚本时出现错误:

CORS Error: The request has been blocked because of the CORS policy

下面是我的脚本:

var ss = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/1UEzI8a8qVBqzVGuA4AZKs4eb4Y5bqOlIOJWwBDkEKb8/edit#gid=0");
var sheet = ss.getSheetByName('Items'); // be very careful ... it is the sheet name .. so it should match 

function doPost(e) {
    var action = e.parameter.action;

    if (action == 'addItem') {
        return addItem(e);
    }
}

function addItem(e) {
    var date = new Date();
    var id = "Item" + sheet.getLastRow(); // Item1
    var itemName = e.parameter.itemName;
    var brand = e.parameter.brand;

    sheet.appendRow([date, id, itemName, brand]);

    return ContentService.createTextOutput("Success").setMimeType(ContentService.MimeType.TEXT);
}

1 个答案:

答案 0 :(得分:0)

您需要从doPost而不是addItem返回一个值。

这也总是使我绊倒。如果没有返回值,则会收到CORS警告,并且POST失败。

由于这个原因,很难判断脚本是否失败或发布请求是否有问题。尝试将所有内容包装在try, catch, finally中,以确保始终返回一个值。

尝试一下。有点冗长,但它应确保您确实收到对POST请求的响应,并且该响应包含查看出问题所在所需的所有信息。

function doPost(e) {
  var returnJson = {
    success: false,
    errors: [],
    returnValue: null,
    debug: [],
  };

  try {
    if (e.parameter && e.parameter.action) {
      var action = e.parameter.action;
      if (action == "addItem") {
        var itemAdded = addItem(e);
        returnJson.debug.push(itemAdded);
      }
      returnJson.success = true;
    } else {
      returnJson.debug.push("No value 'action' in e.parameter");
    }
  } catch (err) {
    returnJson.errors.push(err);
  } finally {
    return ContentService.createTextOutput(
      JSON.stringify(returnJson)
    ).setMimeType(ContentService.MimeType.JSON);
  }
}

function addItem(e) {
  var returnJson = {
    success: false,
    errors: [],
    returnValue: null,
    debug: [],
  };
  try {
    var date = new Date();
    var id = "Item" + sheet.getLastRow(); // Item1
    var itemName = e.parameter.itemName;
    var brand = e.parameter.brand;

    var ss = SpreadsheetApp.openByUrl(
      "https://docs.google.com/spreadsheets/d/1UEzI8a8qVBqzVGuA4AZKs4eb4Y5bqOlIOJWwBDkEKb8/edit#gid=0"
    );
    var sheet = ss.getSheetByName("Items"); // be very careful ... it is the sheet name .. so it should match

    sheet.appendRow([date, id, itemName, brand]);
    returnJson.success = true;
  } catch (err) {
    returnJson.errors.push(err);
  } finally {
    return returnJson;
  }
}