1

我有一个代码,通过它我可以从工作表中删除所有空行和列。是否可以使用批处理请求来加快脚本的工作,因为当文件很多时,需要很长时间?

下面的代码

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

我将不胜感激

4

1 回答 1

3

我相信你的目标如下。

  • 您想降低脚本的处理成本。
  • 您想使用批处理请求。

修改点:

  • 在这种情况下,作为一种简单的方法,我想建议使用 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);
          }
        });
      }
    

参考:

于 2021-01-14T12:43:44.013 回答