Как ссылаться на массив из HTTP GET-запроса?
Я делаю сценарий для моего hubot, который должен распечатать все элементы столбца в документе Smartsheet. К сожалению, невозможно просто напечатать все элементы столбца, поскольку ячейки в основном хранятся в строках. Чтобы сослаться на ячейку в API, нужно вызвать https://api.smartsheet.com/2.0/sheets/[SHEET-ID]/rows/[ROW-ID]/columns/[COLUMN-ID]. Идентификаторы строк и столбцов - это не просто их размещение на листе, а уникальные многозначные идентификаторы.
Мой план печати элементов столбца состоял в том, чтобы собрать все идентификаторы строк из данного документа в массиве rowNums; получить необходимый идентификатор столбца (цель состоит в том, чтобы напечатать список имен, поэтому мы ищем столбец с именем "Имя") и сохранить его в colNum; затем для каждого элемента в rowNums сделайте HTTP-запрос GET к ячейке с элементом из rowNums и colNum и сохраните его в массиве, который я распечатал бы для пользователя.
Последняя часть кода выглядит хорошо, но у меня возникают проблемы с простой ссылкой на элементы из массива 'rows' из документа Smartsheet. У меня есть мой код ниже как в CoffeeScript (в котором должен быть скрипт), так и в JavaScript (скомпилирован с использованием 'coffee --c', так что это немного грязно). Что я делаю неправильно?
CoffeeScript
robot.http(url)
.headers(Authorization: auth, Accept: 'application/json')
.get() (err, res, body) ->
data = JSON.parse(body)
if res.statusCode isnt 200
msg.send "An error occurred when processing your request:
#{res.statusCode}. The list of error codes can be found at
http://bit.ly/ss-errors. Talk to the nearest code nerd for
assistance."
else
# Populate 'rows' with all rowId's from default sheet.
rowNums = (row.id for row in data.rows)
# Parses 'columns' for column titled 'Name'. Stops when it finds it.
for column in data.columns
if column.title.toLowerCase() == "name"
colNum = column.id
break
else
return undefined
JAVASCRIPT
robot.http(url).headers({
Authorization: auth,
Accept: 'application/json'
}).get()(function(err, res, body) {
var column, data, i, len, ref, row;
data = JSON.parse(body);
if (res.statusCode !== 200) {
return msg.send("An error occurred when processing your request: " + res.statusCode + ". The list of error codes can be found at http://bit.ly/ss-errors. Talk to the nearest code nerd for assistance.");
} else {
rowNums = (function() {
var i, len, ref, results;
ref = data.rows;
results = [];
for (i = 0, len = ref.length; i < len; i++) {
row = ref[i];
results.push(row.id);
}
return results;
})();
ref = data.columns;
for (i = 0, len = ref.length; i < len; i++) {
column = ref[i];
if (column.title.toLowerCase() === "name") {
colNum = column.id;
break;
} else {
return void 0;
}
}
}
});
Кроме того, как мне избавиться от строки 'return void 0' из моего CoffeeScript? Он там со строками 'else > return undefined' или без них.
1 ответ
Когда я компилирую код с кофе -c test.coffee (без возврата else, неопределенного), я получаю это:
// Generated by CoffeeScript 1.9.3
(function() {
robot.http(url).headers({
Authorization: auth,
Accept: 'application/json'
}).get()(function(err, res, body) {
var colNum, column, data, i, len, ref, results, row, rowNums;
data = JSON.parse(body);
if (res.statusCode !== 200) {
return msg.send("An error occurred when processing your request: " + res.statusCode + ". The list of error codes can be found at http://bit.ly/ss-errors. Talk to the nearest code nerd for assistance
} else {
rowNums = (function() {
var i, len, ref, results;
ref = data.rows;
results = [];
for (i = 0, len = ref.length; i < len; i++) {
row = ref[i];
results.push(row.id);
}
return results;
})();
ref = data.columns;
results = [];
for (i = 0, len = ref.length; i < len; i++) {
column = ref[i];
if (column.title.toLowerCase() === "name") {
colNum = column.id;
break;
} else {
results.push(void 0);
}
}
return results;
}
});
}).call(this);