Я пытаюсь загрузить диапазон данных в Salesforce, используя следующий сценарий, однако в настоящее время он настроен на выполнение только одной строки за раз, что я использую для a для l oop в другой функции, однако, мои данные часто превышают 2000 строк, и время ожидания истекло. Я использую функцию для форматирования диапазона данных в формате JSON. Можно ли поместить sh каждый JSON в массив и передать его через мой HTTP-вызов за один go?
Загрузка в SF
function upsert(object, pl, id, idField, row) {
var payload = tableJSON(pl);
var sfService = getSfService();
var userProps = PropertiesService.getUserProperties();
var props = userProps.getProperties();
var name = getSfService().serviceName_;
var obj = JSON.parse(props['oauth2.' + name]);
var instanceUrl = obj.instance_url;
var queryUrl = instanceUrl + "/services/data/v42.0/sobjects/" + object +"/" + idField +"/" + id;
var response = UrlFetchApp.fetch(queryUrl, {
headers: {
Authorization: "Bearer " + sfService.getAccessToken()
},
contentType: 'application/json',
payload: payload,
method: "PATCH",
muteHttpExceptions: true
});
}
таблица JSON
function tableJSON(arr) {
var i, j, obj = {};
for (i = 0; i < arr.length; i++) {
for (j = 0; j < arr[0].length; j++) {
obj[arr[0][j]] = arr[i][j];
}
}
return JSON.stringify(obj);
}
Если кто-то знаком с этим, я в основном пытаюсь воссоздать то, что делает надстройка Data Connector by Google.
Опять же, я хочу взять диапазон данных, преобразовать это полезная нагрузка, которую я могу запустить через HTTP-вызов сразу и предпочтительно обновить каждую строку с успехом или кодом ответа / телом ошибки. У меня вопрос: как мне отформатировать полезную нагрузку, чтобы эта работа работала, как описано?
edit: я не включил все функции, такие как getSfService (). Если вы хотите увидеть все это, - это github , с которым я работал для создания своего кода.
edit: Это то, что в конечном итоге сработало для меня:
function upsertPage(object, idCol) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var data = sheet.getDataRange().getDisplayValues();
var sfService = getSfService();
var userProps = PropertiesService.getUserProperties();
var props = userProps.getProperties();
var name = getSfService().serviceName_;
var obj = JSON.parse(props['oauth2.' + name]);
var instanceUrl = obj.instance_url;
var idCol = colCt(idCol);
var idField = data[0][idCol];
var dataJSON = getJSON(data,idCol);
var requestArr = [];
for (i=1;i<data.length;i++){
var id = data[i][idCol];
var payload = JSON.stringify(dataJSON[i-1]);
var request = {
'url': instanceUrl + "/services/data/v42.0/sobjects/" + object +"/" + idField +"/" + id,
'headers': {Authorization: "Bearer " + sfService.getAccessToken()},
'contentType': 'application/json',
'method': 'PATCH',
'payload': payload,
'muteHttpExceptions': true
};
requestArr.push(request);
};
var response = UrlFetchApp.fetchAll(requestArr);
}
}
function colCt(colLetter){
var abc = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
for (i=0;i<abc.length;i++){
var colLetter = colLetter.toUpperCase();
if (colLetter === abc[i].toUpperCase()){
return i;
}
}
}
function getJSON(data, extIdCol){
var obj = {};
var result = [];
var headers = data[0];
var cols = headers.length;
var row = [];
var extIdHeader = data[0][extIdCol];
for (var i = 1, l = data.length; i < l; i++){
// get a row to fill the object
row = data[i];
// clear object
obj = {};
for (var col = 0; col < cols; col++)
{
// fill object with new values
obj[headers[col]] = row[col];
}
// add object in a final result
result.push(obj);
}
for(i=0;i<result.length;i++){
delete result[i][extIdHeader];
}
return result;
}