如何使用批处理请求删除空行和列
how to remove empty rows and columns using batch request
我有一个代码可以从 sheet 中删除所有空行和空列。是否可以使用批处理请求来加快脚本的工作速度,因为当文件很多时,需要很长时间?
下面的代码
while ( files.hasNext()){
var file1 = files.next().getId();
var sheet = SpreadsheetApp.openById(file1);
var allsheets = sheet.getSheets();
for (var s in allsheets){
var sheet=allsheets[s]
var maxColumns = sheet.getMaxColumns();
var lastColumn = sheet.getLastColumn();
var maxRows = sheet.getMaxRows();
var lastRow = sheet.getLastRow();
if (maxRows-lastRow === 0){}
else {
if (maxRows-lastRow != 0){
sheet.deleteRows(lastRow+1, maxRows-lastRow);
}
console.log(sheet)
if (maxColumns-lastColumn != 0){
sheet.deleteColumns(lastColumn+1, maxColumns-lastColumn);
}
console.log(sheet)
}
}
}
如有任何帮助,我将不胜感激
我相信你的目标如下。
- 您想减少脚本的处理成本。
- 您想使用批量请求。
修改点:
- 在这种情况下,作为一种简单的方法,我想建议使用Sheets API的batchUpdate方法来删除行和列。我以为这样,工艺成本会降低一点。
当以上几点反映到你的脚本中,就会变成下面这样。
修改后的脚本:
在您使用此脚本之前,please enable Sheets API at Advanced Google services。
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);
}
}
- 当此脚本为运行时,Spreadsheet中所有sheet的空行和空列被删除。
- 对于空 sheet,当您只想在 sheet 中保留单元格“A1”时,请使用注释脚本。
注:
我认为上面的示例脚本在文件数量较少的情况下可能比较合适。但是,当文件数量很大时,使用Drive API 检索文件列表时,处理成本可能会降低更多。在这种情况下,使用 Drive API v3 检索文件列表的过程成本低于使用 Advanced Google 服务的 Drive API v2。因此,此示例脚本使用 UrlFetchApp 使用 Drive API v3。在此示例脚本中,根据您的脚本,它假设文件存在于文件夹下。请注意这一点。
当您使用此脚本时,请在高级 Google 服务中启用驱动器 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);
}
});
}
参考文献:
我有一个代码可以从 sheet 中删除所有空行和空列。是否可以使用批处理请求来加快脚本的工作速度,因为当文件很多时,需要很长时间?
下面的代码
while ( files.hasNext()){
var file1 = files.next().getId();
var sheet = SpreadsheetApp.openById(file1);
var allsheets = sheet.getSheets();
for (var s in allsheets){
var sheet=allsheets[s]
var maxColumns = sheet.getMaxColumns();
var lastColumn = sheet.getLastColumn();
var maxRows = sheet.getMaxRows();
var lastRow = sheet.getLastRow();
if (maxRows-lastRow === 0){}
else {
if (maxRows-lastRow != 0){
sheet.deleteRows(lastRow+1, maxRows-lastRow);
}
console.log(sheet)
if (maxColumns-lastColumn != 0){
sheet.deleteColumns(lastColumn+1, maxColumns-lastColumn);
}
console.log(sheet)
}
}
}
如有任何帮助,我将不胜感激
我相信你的目标如下。
- 您想减少脚本的处理成本。
- 您想使用批量请求。
修改点:
- 在这种情况下,作为一种简单的方法,我想建议使用Sheets API的batchUpdate方法来删除行和列。我以为这样,工艺成本会降低一点。
当以上几点反映到你的脚本中,就会变成下面这样。
修改后的脚本:
在您使用此脚本之前,please enable Sheets API at Advanced Google services。
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);
}
}
- 当此脚本为运行时,Spreadsheet中所有sheet的空行和空列被删除。
- 对于空 sheet,当您只想在 sheet 中保留单元格“A1”时,请使用注释脚本。
注:
我认为上面的示例脚本在文件数量较少的情况下可能比较合适。但是,当文件数量很大时,使用Drive API 检索文件列表时,处理成本可能会降低更多。在这种情况下,使用 Drive API v3 检索文件列表的过程成本低于使用 Advanced Google 服务的 Drive API v2。因此,此示例脚本使用 UrlFetchApp 使用 Drive API v3。在此示例脚本中,根据您的脚本,它假设文件存在于文件夹下。请注意这一点。
当您使用此脚本时,请在高级 Google 服务中启用驱动器 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); } }); }