从Google Sheets中提取API调用,将多张卡添加到多个客户应用程序脚本



我已经成功地从google表单中添加了一张卡片,通过他们的API 进行条纹化

function StripeAddCard(){
var cardno = "4242424242424242";
var cardexpmo = "42";
var cardexpyr = "42";
var url = "https://api.stripe.com/v1/customers/cus_M0hfHRz4zizqes/sources";

var params = {
// method: "get",
headers: {Authorization: "Basic " + Utilities.base64Encode("sk_live_*************:")},
payload: {
"source[object]": "card",
"source[number]": cardno, 
"source[exp_month]": cardexpmo,
"source[exp_year]": cardexpyr},
muteHttpExceptions: true
//  limit: 2 //limit not working
}

var response = UrlFetchApp.fetch(url,params);

//const json = response.getContentText();
//const CustomerData = JSON.parse(json);
//console.log(CustomerData.name);
console.log(response.getContentText());
}

我现在尝试以此为例,在电子表格中循环,收集所有适当的值,然后通过同一个API一次发送一个值。它返回的不是成功的响应,而是:

{ toString: [Function],
getResponseCode: [Function],
getContent: [Function],
getHeaders: [Function],
getContentText: [Function],
getAllHeaders: [Function],
getBlob: [Function],
getAs: [Function] }

如果成功,响应如下:

{
"id": "card_1LQElcG7pYQHkBLcGMk7wetP",
"object": "card",
"address_city": null,
"address_country": null,
"address_line1": null,
"address_line1_check": null,
"address_line2": null,
"address_state": null,
"address_zip": null,
"address_zip_check": null,
"brand": "MasterCard",
"country": "US",
"customer": "cus_M0hfHRz4zizqes",
"cvc_check": null,
"dynamic_last4": null,
"exp_month": 42,
"exp_year": 4242,
"fingerprint": "irG4XOVMCwurPGDJ",
"funding": "debit",
"last4": "4242",
"metadata": {
},
"name": null,
"tokenization_method": null
}

以下是不起作用的代码:

function StripeAddMultiCard(){
var PaymentSSID = "********************";
var WorkingSS = SpreadsheetApp.openById(PaymentSSID);
var WorkingSheet = WorkingSS.getSheetByName("StripeToAdd");

var CardsToAdd = WorkingSheet.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow() - 1;

var DataSet = WorkingSheet.getRange(2,1,CardsToAdd,14).getValues;
var cardname = "Adam";//col2
var cardno = "06"; //col3
var cardexpmo = "12"; //col13
var cardexpyr = "12"; //col14
var cardcvc = "123"; //col5
var custID = "Temp"; //col12
var url = "Temp"; //"https://api.stripe.com/v1/customers/cus_M0hfHRz4zizqes/sources";

for (var i=0; i<3; i++){
cardname = WorkingSheet.getRange(i+2,2).getValues()[0][0]; 
cardno = WorkingSheet.getRange(i+2,3).getValues()[0][0];
cardexpmo = WorkingSheet.getRange(i+2,13).getValues()[0][0];
cardexpyr = WorkingSheet.getRange(i+2,14).getValues()[0][0];
cardcvc = WorkingSheet.getRange(i+2,5).getValues()[0][0];
custID = WorkingSheet.getRange(i+2,12).getValues()[0][0];
url= "https://api.stripe.com/v1/customers/" + custID + "/sources"
console.log("source[number]" + cardno); 
console.log("source[exp_month]" + cardexpmo);
console.log("source[exp_year]"+ cardexpyr);
console.log("source[cvc]"+ cardcvc);
console.log("source[name]"+ cardname);
console.log("source[url]"+ url);

var params = {
// method: "get",
headers: {Authorization: "Basic " + Utilities.base64Encode("sk_live_*********************:")},
payload: {
"source[object]": "card",
"source[number]": cardno, 
"source[exp_month]": cardexpmo,
"source[exp_year]": cardexpyr},
muteHttpExceptions: true
//  limit: 2 //limit not working
}
var response = UrlFetchApp.fetch(url,params);
console.log(response);
Utilities.sleep(51);
}
}

看起来这实际上已经开始工作了。我确实在最后更改了控制台日志以获得预期的响应,因为第二个函数有console.log(response(,而不是console.log(response.getContentText(((。

当您发现最后的日志不起作用时,我做了一些改进。从图纸中获取值和在图纸中设置值都很耗时。现在,我们通过一个调用获取内存中的所有数据,并从中发出请求。

我们还可以做一个优化,那就是使用.fetchAll((。谷歌进行并行请求并同时返回所有响应。当你提出许多请求时,这将大大提高你的速度,但目前:

function StripeAddMultiCard() {
var PaymentSSID = "********************";
var WorkingSS = SpreadsheetApp.openById(PaymentSSID);
var WorkingSheet = WorkingSS.getSheetByName("StripeToAdd");
var SheetValues = WorkingSheet.getRange(2, 1, WorkingSheet.getLastRow() - 1, 14).getValues();
SheetValues.forEach(row => {
var cardname = row[1] //Not used?
var cardno = row[2]
var cardexpmo = row[12]
var cardexpyr = row[13]
var cardcvc = row[4] //Not used?
var custID = row[11]
var url = "https://api.stripe.com/v1/customers/" + custID + "/sources"
var params = {
method: "post",
headers: { Authorization: "Basic " + Utilities.base64Encode("sk_live_*********************:") },
payload: {
"source[object]": "card",
"source[number]": cardno,
"source[exp_month]": cardexpmo,
"source[exp_year]": cardexpyr
},
muteHttpExceptions: true
}
var response = UrlFetchApp.fetch(url, params);
console.log(response.getContentText());
})
}

最新更新