Каждый конец месяца я дублирую вкладку с несколькими скрытыми строками, а затем удаляю все эти скрытые строки из дублирующей вкладки. Для этой цели я изменил следующий код Танаике, код работает без ошибок, но все скрытые строки все еще присутствуют.
Подскажите, пожалуйста, какие исправления следует внести в код.
Вот модифицированный код:
function deleteHiddenRows() {
const spreadsheetId = SpreadsheetApp.openById(gid);
const sheetName = spreadsheetId.getSheetByName(tab);
const lastRow = sheetName.getLastRow();
const sheetId = sheetName.getSheetId();
const fields = "sheets(data(rowMetadata(hiddenByUser)),properties/sheetId)";
const rowMetadata = SheetsV4.Spreadsheets.get(gid, { fields: fields }).sheets[0].data[0].rowMetadata;
const requests = rowMetadata.reduce((ar, { hiddenByUser }, i) => {
if (hiddenByUser && i > 0 && i + 1 < lastRow) ar.push({ deleteDimension: { range: { sheetId, startIndex: i, endIndex: i + 1, dimension: "ROWS" } } });
return ar;
}, []);
SheetsV4.Spreadsheets.batchUpdate({requests}, gid);
}
Я попробовал ваш код и внес некоторые незначительные изменения, и это то, что работает с моей стороны. Кажется, проблема связана с поведением Reduce Array Method
, и я изменил его. Пожалуйста, обратитесь к сценарию ниже.
function deleteHiddenRows() {
const spreadsheetId = 'Replace it with your actual SpreadsheetID';
const sheetName = 'Replace it with your duplicate sheet tab';
const spreadsheet = SpreadsheetApp.openById(spreadsheetId);
const sheet = spreadsheet.getSheetByName(sheetName);
const sheetId = sheet.getSheetId();
const lastRow = sheet.getLastRow();
const fields = "sheets(data(rowMetadata(hiddenByUser)),properties/sheetId)";
// Fetch row metadata using Sheets API v4
const rowMetadataResponse = Sheets.Spreadsheets.get(spreadsheetId, { fields: fields }); //For some reason SheetsV4.Spreadsheets.get doesnt work in my end.
const rowMetadata = rowMetadataResponse.sheets[0].data[0].rowMetadata;
// Build batch update requests to delete hidden rows
const requests = [];
for (let i = rowMetadata.length - 1; i >= 0; i--) {
if (rowMetadata[i].hiddenByUser) {
requests.push({ deleteDimension: { range: { sheetId: sheetId, startIndex: i, endIndex: i + 1, dimension: 'ROWS' } } });
}
}
Sheets.Spreadsheets.batchUpdate({ requests: requests }, spreadsheetId);
}
Вместо использования этой части вашего кода
const requests = rowMetadata.reduce((ar, { hiddenByUser }, i) => {
if (hiddenByUser && i > 0 && i + 1 < lastRow) ar.push({ deleteDimension: { range: { sheetId, startIndex: i, endIndex: i + 1, dimension: "ROWS" } } });
return ar;
}, []);
Попробуйте использовать этот:
const requests = [];
for (let i = rowMetadata.length - 1; i >= 0; i--) {
if (rowMetadata[i].hiddenByUser) {
requests.push({ deleteDimension: { range: { sheetId: sheetId, startIndex: i, endIndex: i + 1, dimension: 'ROWS' } } });
}
}
Я использовал цикл for
для перебора rowMetadata
диапазонов данных. Эта обратная итерация предотвращает проблемы и гарантирует, что удаление строк не повлияет на индексы строк, которые еще предстоит обработать.
@Alma_Matters предоставил код, который решил мою проблему, если в моем файле была только 1 вкладка. Поскольку в моем файле было более 1 вкладки (во-первых, я виноват в том, что не указал точное условие), код не будет работать так, как я хочу.
Затем я исправил исходный код и, наконец, нашел обходной путь. Ниже приведен код, который решил мой реальный случай.
const gid = '###'; //spreadsheet id
const tab = 'tab name'; //tab name
function deleteHiddenRows() {
const spreadsheetId = SpreadsheetApp.openById(gid);
const sheetName = spreadsheetId.getSheetByName(tab);
const lastRow = sheetName.getLastRow();
const sheetId = sheetName.getSheetId();
const idx = sheetName.getIndex()-1; //get the index of the tab
const fields = "sheets(data(rowMetadata(hiddenByUser)),properties/sheetId)";
const rowMetadata = Sheets.Spreadsheets.get(gid, { fields: fields}).sheets[idx].data[0].rowMetadata;
const requests = rowMetadata.reduceRight((ar, { hiddenByUser }, i) => {
if (hiddenByUser && i > 0 && i + 1 < lastRow) {
ar.push({
deleteDimension: {
range: {
sheetId, startIndex: i, endIndex: i + 1, dimension: "ROWS"
}
}
});
}
return ar;
}, []);
if (requests.length > 0){
Sheets.Spreadsheets.batchUpdate({requests}, gid);
}
}
ваш код решил проблему, и спасибо за быстрый ответ.