如何使用批处理请求删除空行和列

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);
          }
        });
      }
    

参考文献: