我相信你的目标如下。
修改点:
- 在这种情况下,作为一种简单的方法,我想建议使用 Sheets API 的 batchUpdate 方法来删除行和列。我认为这样,工艺成本会降低一点。
当以上几点反映到您的脚本时,它变成如下。
修改后的脚本:
在使用此脚本之前,请在 Advanced Google services 中启用 Sheets API。
while (files.hasNext()){
var file1 = files.next().getId();
var ss = SpreadsheetApp.openById(file1);
var sheets = ss.getSheets();
var requests = sheets.reduce((ar, sheet) => {
var sheetId = sheet.getSheetId();
var maxColumns = sheet.getMaxColumns();
var lastColumn = sheet.getLastColumn();
var maxRows = sheet.getMaxRows();
var lastRow = sheet.getLastRow();
if (lastRow > 1 && maxRows > lastRow) {
ar.push({deleteDimension: {range: {sheetId: sheetId, dimension: "ROWS", startIndex: lastRow}}});
}
if (lastColumn > 1 && maxColumns > lastColumn) {
ar.push({deleteDimension: {range: {sheetId: sheetId, dimension: "COLUMNS", startIndex: lastColumn}}});
}
// For empty sheet, when you want to leave only cell "A1", please use the following script.
// if (lastRow == 0 && lastColumn == 0 && maxRows > 1 && maxColumns > 1) {
// ar.push({deleteDimension: {range: {sheetId: sheetId, dimension: "ROWS", startIndex: 1}}});
// ar.push({deleteDimension: {range: {sheetId: sheetId, dimension: "COLUMNS", startIndex: 1}}});
// }
return ar;
}, []);
if (requests.length > 0) {
Sheets.Spreadsheets.batchUpdate({requests: requests}, id);
}
}
- 运行此脚本时,将删除电子表格中所有工作表中的空行和列。
- 对于空工作表,当您只想在工作表中保留单元格“A1”时,请使用注释脚本。
笔记:
我认为当文件数量很少时,上面的示例脚本可能是合适的。但是,当文件数量很大时,当使用 Drive API 检索文件列表时,处理成本可能会降低更多。在这种情况下,使用 Drive API v3 检索文件列表的过程成本低于使用 Advanced Google 服务的 Drive API v2 检索文件列表的过程成本。因此,此示例脚本使用了使用 UrlFetchApp 的 Drive API v3。在此示例脚本中,从您的脚本中,它假定文件存在于文件夹下。请注意这一点。
使用此脚本时,请在 Google 高级服务中启用 Drive API。
function myFunction() {
var topFolderId = "###"; // Please set the folder ID of the top folder.
// Retrieve file list using Drive API v3.
const headers = {authorization: `Bearer ${ScriptApp.getOAuthToken()}`};
const q = `'${topFolderId}' in parents and mimeType='${MimeType.GOOGLE_SHEETS}' and trashed=false`;
const url = `https://www.googleapis.com/drive/v3/files?pageSize=1000&q=${q}&fields=${encodeURIComponent("nextPageToken,files(id)")}`;
let pageToken = "";
let files = [];
do {
const res = UrlFetchApp.fetch(url + "&pageToken=" + pageToken, {headers: headers, muteHttpExceptions: true});
if (res.getResponseCode() != 200) throw new Error(res.getContentText());
const obj = JSON.parse(res.getContentText());
files = files.concat(obj.files);
pageToken = obj.nextPageToken || "";
} while(pageToken);
// Remove empty rows and columns using Sheets API.
files.forEach(({id}) => {
var ss = SpreadsheetApp.openById(id);
var sheets = ss.getSheets();
var requests = sheets.reduce((ar, sheet) => {
var sheetId = sheet.getSheetId();
var maxColumns = sheet.getMaxColumns();
var lastColumn = sheet.getLastColumn();
var maxRows = sheet.getMaxRows();
var lastRow = sheet.getLastRow();
if (lastRow > 1 && maxRows > lastRow) {
ar.push({deleteDimension: {range: {sheetId: sheetId, dimension: "ROWS", startIndex: lastRow}}});
}
if (lastColumn > 1 && maxColumns > lastColumn) {
ar.push({deleteDimension: {range: {sheetId: sheetId, dimension: "COLUMNS", startIndex: lastColumn}}});
}
if (lastRow == 0 && lastColumn == 0 && maxRows > 1 && maxColumns > 1) {
ar.push({deleteDimension: {range: {sheetId: sheetId, dimension: "ROWS", startIndex: 1}}});
ar.push({deleteDimension: {range: {sheetId: sheetId, dimension: "COLUMNS", startIndex: 1}}});
}
return ar;
}, []);
if (requests.length > 0) {
Sheets.Spreadsheets.batchUpdate({requests: requests}, id);
}
});
}
参考: