Я использую запрос API Google Sheet и не получаю даже сообщения об ошибке, чтобы узнать, чего мне не хватает или что я делаю неправильно. я получаю API call to sheets.spreadsheets.values.append failed with error: Empty response
Итак, я попробовал прочитать документацию здесь. Как ни странно, когда у меня в листе примерно менее 2500 строк данных, API работает, но когда я увеличиваю его до более чем 2500 (обратите внимание: я не знаю точного порога строк этого поведения, но он находится между 2000- 2500), вызов API просто ничего не делает и возвращает мне пустой ответ.
setValues() не мой выбор, поскольку запросы API Google Sheets выполняются быстрее и лучше подходят для моего варианта использования.
Мой вариант использования: мне нужно скопировать и вставить формулы из первой строки в последнюю. Чтобы сделать это, я создаю в цикле массив новых формул для каждой строки, а затем сохраняю его в массиве (что делает его двумерным массивом), а затем это то, что я ввожу в запрос API.
См. фрагмент кода ниже:
try{
let lastRow = sheet.getLastRow();
let formulaRow = headers + 1;
let formula = getNewFormulaRange(formulaRange, formulaRow);
let sourceFormulaRange = sheet.getRange(formula);
const sourceFormulas = sourceFormulaRange.getFormulas()[0]; // Extract just the first (and only) row of formulas
let formulasToBeApplied = [];
for (let i = formulaRow+1; i <= lastRow; i++) {
// For each original formula, modify it to suit the new row number
const adjustedFormulas = sourceFormulas.map(formula =>
formula.replace(new RegExp(`(\\$?[A-Z]+)\\$?${formulaRow}`, 'g'), (match, cellReference) => {
// Replace all instances of column references followed by 'formulaRow' with the same column reference followed by the new row number
return `${cellReference}${i}`;
})
);
formulasToBeApplied.push(adjustedFormulas);
}
const startingAppendRow = getNewFormulaRange( formulaRange, headers+2 );
const valueRange = Sheets.newValueRange();
valueRange.values = formulasToBeApplied;
const options = {
valueInputOption: "USER_ENTERED"
}
let result;
if (formulasToBeApplied.length > 0) {
result = Sheets.Spreadsheets.Values.append(valueRange, sheetId, `${sheet.getName()}!${startingAppendRow}`, options);
}
К сожалению, судя по вашему вопросу, я не знаю вашей реальной ситуации. Но, по моему опыту, когда в Sheets API возникает ошибка Empty response
, введенные значения большие. Реф (Автор: я) Если эта ситуация аналогична вашей, то как насчет следующей модификации?
if (formulasToBeApplied.length > 0) {
result = Sheets.Spreadsheets.Values.append(valueRange, sheetId, `${sheet.getName()}!${startingAppendRow}`, options);
}
if (formulasToBeApplied.length > 0) {
const split = 2000;
const v = [...Array(Math.ceil(formulasToBeApplied.length / split))].map((_) => formulasToBeApplied.splice(0, split));
result = v.map(values => Sheets.Spreadsheets.Values.append({ values }, sheetId, `${sheet.getName()}!${startingAppendRow}`, options));
}
formulasToBeApplied
добавляются к листу путем разделения значений.note that: I do not know the exact row threshold of this behavior but its between 2000-2500
количество строк составляет 2000. Но если возникнет ошибка, измените значение const split = 2000;
, например const split = 1000;
, и проверьте его еще раз.
Хотя, к сожалению, я не знаю вашей реальной ситуации, в качестве ответа я предложил модификацию. Пожалуйста, подтвердите это. Если я неправильно понял вашу реальную ситуацию и это было бесполезно, прошу прощения.