Я создаю решение, в котором количество параметров, добавляемых к HTTP-запросу на получение, является переменным. Это означает, что URL-адрес может содержать от 1 до n параметров. Параметры в URL обозначаются стандартным именем и прикрепленным индексом. Вот пример URL:
Как мне интерпретировать переменное количество параметров в моей функции doGet() в .gs?
Обновлено: Я хочу создать с помощью этого запроса заголовок нового листа Google. Переменное количество параметров должно быть заголовками столбцов. Например. если запрос содержит 5 параметров, я хочу добавить в первую строку листа Google в столбцы с 1 по 5 соответствующие значения параметров.
Я попробовал следующий код, но он не работает:
function doGet(request) {
var FileNameString = request.parameter.fileName; //name of the new .gs file
var FridgeItems = request.parameter.fridgeItems; //amount of parameters/column headers passed to .gs
var sheet = SpreadsheetApp.create(FileNameString);
for(var i=0; i<FridgeItems ; i++){
sheet.getRange(1,i+2)
.setValues(
sheet.appendRow([request.parameter.fridgeItem&i]);
);
}
}
}
@Iamblichus спасибо за быстрый ответ. я обновил вопрос, чтобы он был более точным, а также изменил исходный код на основе текущего состояния исследований. я хочу добиться того, чтобы значение каждого ключа представляло заголовок. заголовки еще не настроены, но их необходимо настроить динамически. Функция appendRow использовалась только из-за отсутствия функции appendColumn. Поскольку лист пуст, appendRow добавит строку 1.
Когда сделан запрос GET
, вы хотите создать новую электронную таблицу, имя которой будет значением ключа параметра запроса fileName
, а все остальные значения из всех других параметров запроса будут добавлены к единственному листу созданной электронной таблицы.
fileName
и удалите это свойство из объекта request.parameter
, используя оператор удаления .Spreadsheet.appendRow()
, чтобы добавить эти значения в созданную электронную таблицу.function doGet(request) {
const parameters = request.parameter;
const fileName = parameters.fileName;
delete parameters.fileName;
const headers = Object.values(parameters);
const spreadsheet = SpreadsheetApp.create(fileName);
spreadsheet.appendRow(headers);
return ContentService.createTextOutput("Headers appended!");
}
Если вы хотите убедиться, что заголовки установлены в том же порядке, что и в запросе, вы можете вместо этого использовать request.queryString
, который возвращает часть строки запроса URL-адреса, поэтому в этом случае это будет выглядеть так:
fileName=2020-12-15&fridgeItems=2&fridgeItem0=ValueOfFridgeItem0&fridgeItem1=ValueOfFridgeItem1
Затем вы можете использовать комбинацию map и filter, чтобы получить значения (за исключением того, что соответствует fileName
):
function doGet(request) {
const headers = request.queryString.split("&")
.map(param => param.split(" = "))
.filter(param => param[0] !== "fileName")
.map(param => param[1]);
const fileName = request.parameter.fileName;
const sheet = SpreadsheetApp.create(fileName)
sheet.appendRow(headers);
return ContentService.createTextOutput("Headers appended!");
}
Большое спасибо. Это вообще работает! Однако кажется, что порядок параметров запроса изменчив? «Заголовок» создается, но не в том порядке, в котором были предоставлены параметры. Несколько запусков дают разные результаты по порядку. Есть ли шанс повлиять на порядок? Спасибо за поддержку!
@AndreasKurz Я добавил в свой ответ альтернативный код, чтобы сохранить порядок.
Можете ли вы предоставить скриншот желаемого результата? Я не уверен, что понимаю это. Вы хотите, чтобы каждый ключ был заголовком, а соответствующее значение добавлялось под заголовком? Существуют ли ключи с несколькими значениями? Заголовки уже настроены или вы хотите проверить, существует ли заголовок, и просто добавить значение ниже, если это так? Есть несколько проблем с кодом, которым вы поделились, но я не буду предлагать модификации, пока не буду уверен, что понимаю вашу цель.