Google script - Service error: Spreadsheets

Google script - Service error: Spreadsheets

几周后,运行 Google 表格中的脚本出现“服务错误:电子表格”错误。在此之前,它工作正常。

它应该在删除一些空行的同时导出 PDF。

我尝试添加 1000 毫秒的延迟,但没有用。

如有任何帮助,我们将不胜感激。您可以在下面找到代码。


var sheetName = "PDF - B";
var sheetName2 = "Offertes";
var folderID = "XXX"; // Folder id to save in a folder.

var sourceSpreadsheet = SpreadsheetApp.getActive();
var sourceSheet = sourceSpreadsheet.getSheetByName(sheetName);
var sourceSheet2 = sourceSpreadsheet.getSheetByName(sheetName2);
var folder = DriveApp.getFolderById(folderID);
  
var invoiceName = sourceSheet.getRange("B57").getValue(); 
var invoiceDate = sourceSheet.getRange("H57").getValue();
var invoiceBusnr = sourceSheet.getRange("J1").getValue();
var invoiceDate_2 = Utilities.formatDate(invoiceDate, "CET", "yyyy-MM-dd")
var pdfName = "["+invoiceDate_2+"] "+invoiceName+" - Offerte "+invoiceBusnr+" Ventje";


var fact = sourceSheet.getRange("H60").getValue(); 
var value_f1 = sourceSheet.getRange("I53").getValue();
var value_f2 = sourceSheet.getRange("I54").getValue();
var buyerRow = sourceSheet.getRange("I61").getValue(); 
var buyerColumn = sourceSheet.getRange("J61").getValue(); 
var vColumn = sourceSheet.getRange("G61").getValue();

var f_cell = sourceSheet2.getRange(buyerRow,buyerColumn);
var f_version = sourceSheet2.getRange(buyerRow,vColumn);

if (fact=="F1") {
      f_cell.setValue(value_f1);
      f_version.setValue(2);  
}
if (fact=="F2") {
      f_cell.setValue(value_f2);
}



//Copy whole spreadsheet
var destSpreadsheet = SpreadsheetApp.open(DriveApp.getFileById(sourceSpreadsheet.getId()).makeCopy("tmp_convert_to_pdf", folder));



//repace cell values with text (to avoid broken references) 
var destSheet = destSpreadsheet.getSheets()[0]
var destSheet = destSpreadsheet.getSheetByName(sheetName)
var sourceRange = sourceSheet.getRange(1,1,sourceSheet.getMaxRows(),sourceSheet.getMaxColumns()); 
var sourcevalues = sourceRange.getValues();
var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns());
destRange.setValues(sourcevalues);



var imageSheet = destSpreadsheet.getSheetByName("Bus foto's");
var imageRow = destSheet.getRange("B1").getValue();

var sourceImage_1 = imageSheet.getRange(imageRow, 2, 1, 1);
var destImage_1 = destSheet.getRange(4, 2, 1, 1);
var sourceImage_2 = imageSheet.getRange(imageRow, 3, 1, 1);
var destImage_2 = destSheet.getRange(4, 7, 1, 1);
var sourceImage_3 = imageSheet.getRange(imageRow, 4, 1, 1);
var destImage_3 = destSheet.getRange(6, 2, 1, 1);
var sourceImage_4 = imageSheet.getRange(imageRow, 5, 1, 1);
var destImage_4 = destSheet.getRange(6, 7, 1, 1);

sourceImage_1.copyTo(destImage_1,SpreadsheetApp.CopyPasteType.PASTE_VALUES,false);
sourceImage_2.copyTo(destImage_2,SpreadsheetApp.CopyPasteType.PASTE_VALUES,false);
sourceImage_3.copyTo(destImage_3,SpreadsheetApp.CopyPasteType.PASTE_VALUES,false);
sourceImage_4.copyTo(destImage_4,SpreadsheetApp.CopyPasteType.PASTE_VALUES,false);

//delete redundant sheets
var sheets = destSpreadsheet.getSheets();
for (i = 0; i < sheets.length; i++) {
  if (i % 10 == 0) { Utilities.sleep(3000); } // Pause the function for 3000 milliseconds after 10 iterations
  if (sheets[i].getSheetName() != sheetName){
  destSpreadsheet.deleteSheet(sheets[i]);
  }
}


//delete redundant rows

var soverig14 = destSheet.getRange("B50").getValue();
var soverig13 = destSheet.getRange("B49").getValue();
var soverig12 = destSheet.getRange("B48").getValue();
var soverig11 = destSheet.getRange("B47").getValue();
var soverig10 = destSheet.getRange("B46").getValue();
var soverig9 = destSheet.getRange("B45").getValue();
var soverig8 = destSheet.getRange("B44").getValue();
var soverig7 = destSheet.getRange("B43").getValue();
var soverig6 = destSheet.getRange("B42").getValue();
var soverig5 = destSheet.getRange("B41").getValue();
var soverig4 = destSheet.getRange("B40").getValue();
var soverig3 = destSheet.getRange("B39").getValue();
var soverig2 = destSheet.getRange("B38").getValue();
var soverig1 = destSheet.getRange("B37").getValue();

var soverig_t = destSheet.getRange("B36").getValue();
var soverig_m1 = destSheet.getRange("B35").getValue();

var sschuif = destSheet.getRange("B34").getValue();

var boverig3 = destSheet.getRange("B26").getValue();
var boverig2 = destSheet.getRange("B25").getValue();
var boverig1 = destSheet.getRange("B24").getValue();
var boverig0 = destSheet.getRange("B23").getValue();
var boverig_t = destSheet.getRange("B22").getValue();
var boverig_m1 = destSheet.getRange("B21").getValue();

var f1 = destSheet.getRange("B53").getValue();
var f2 = destSheet.getRange("B54").getValue();

var f3 = destSheet.getRange("B60").getValue();
var f4 = destSheet.getRange("B61").getValue();



  if (f4=="") {
    destSheet.deleteRow(61);
  }

  if (f3=="") {
    destSheet.deleteRow(60);
  }

  if (f2=="") {
    destSheet.deleteRow(54);
  }

  if (f1=="") {
    destSheet.deleteRow(53);
  }


  

  if (soverig14=="") {
    destSheet.deleteRow(50);
  }
  if (soverig13=="") {
    destSheet.deleteRow(49);
  }  
  if (soverig12=="") {
    destSheet.deleteRow(48);
  }
  if (soverig11=="") {
    destSheet.deleteRow(47);
  }  
  if (soverig10=="") {
    destSheet.deleteRow(46);
  }
  if (soverig9=="") {
    destSheet.deleteRow(45);
  }  
  if (soverig8=="") {
    destSheet.deleteRow(44);
  }
  if (soverig7=="") {
    destSheet.deleteRow(43);
  }
  if (soverig6=="") {
    destSheet.deleteRow(42);
  }
  if (soverig5=="") {
    destSheet.deleteRow(41);
  }
  if (soverig4=="") {
    destSheet.deleteRow(40);
  }
  if (soverig3=="") {
    destSheet.deleteRow(39);
  }
  if (soverig2=="") {
    destSheet.deleteRow(38);
  }
  if (soverig1=="") {
    destSheet.deleteRow(37);
  }

    if (soverig_t=="") {
    destSheet.deleteRow(36);
  }
  if (soverig_m1=="") {
    destSheet.deleteRow(35);
  }
  if (sschuif=="") {
    destSheet.deleteRow(34);
  }

  if (boverig3=="") {
    destSheet.deleteRow(26);
  }

  if (boverig2=="") {
    destSheet.deleteRow(25);
  }

  if (boverig1=="") {
    destSheet.deleteRow(24);
  }

  if (boverig0=="") {
    destSheet.deleteRow(23);
  }

  if (boverig_t=="") {
    destSheet.deleteRow(22);
  }

  if (boverig_m1=="") {
    destSheet.deleteRow(21);
  }



// export url
  var url = 'https://docs.google.com/spreadsheets/d/'+destSpreadsheet.getId()+'/export?exportFormat=pdf&format=pdf' // export as pdf / csv / xls / xlsx
  + '&size=A4'                           // paper size legal / letter / A4
  + '&portrait=true'                     // orientation, false for landscape
  + '&fitw=true'                        // fit to page width, false for actual size
  + '&scale=4'                            // 1 = Normal 100% -- 2 = Fit to width -- 3 = Fit to height -- 4 = Fit to Page
  //+ '&sheetnames=false&printtitle=false' // hide optional headers and footers
 // + '&pagenumbers=false&gridlines=false' // hide page numbers and gridlines
  //+ '&fzr=false'                         // do not repeat row headers (frozen rows) on each page
  + '&horizontal_alignment=CENTER'        // LEFT/CENTER/RIGHT
  //+ '&vertical_alignment=MIDDLE'          // TOP/MIDDLE/BOTTOM
  //            SET ALL MARGINS IN ORDER FOR IT TO WORK
  + '&top_margin=0.4'                   // set top margin
  + '&bottom_margin=0.4'                // set bottom margin
  + '&left_margin=0.7'                   // set left margin
  + '&right_margin=0.7'                  // set right margin
  + '&gid='+destSheet.getSheetId();    // the sheet's Id
  
  var token = ScriptApp.getOAuthToken();

  // request export url
  var response = UrlFetchApp.fetch(url, {
    headers: {
      'Authorization': 'Bearer ' +  token
    }
  });

  var theBlob = response.getBlob().setName(pdfName+'.pdf');

  // delete pdf if already exists
  var files = folder.getFilesByName(pdfName);
  while (files.hasNext())
  {
    files.next().setTrashed(true);
  }

  // create pdf
  var newFile = folder.createFile(theBlob);

  // return true;

//Delete the temporary sheet
DriveApp.getFileById(destSpreadsheet.getId()).setTrashed(true);


}

我在尝试创建 pdf 时也注意到“服务错误:电子表格”;这开始于 4 月 7 日至 4 月 28 日之间的某个时间。

我已使用 =IMAGE() 函数将其缩小到电子表格中包含图像的一列。如果这些是使用 Range.setValues() 复制的,则会发生“服务错误”。在我看来,这本身就是一个错误,因为它并不能很好地说明问题所在。 =IMAGE() 是否可以使用 setValues()

复制是有争议的

但是,我发现可以使用 Range.setFormulas() 复制图像公式,也可以在使用菜单>插入>图像创建的图像上使用 Range.setValues() 但 [=如果图像是使用 SpreadsheetApp.newCellImage()

从脚本创建的,12=] 不会 工作

最后提到的问题意味着没有绕过脚本来避免脚本出现“服务错误:电子表格”而无需进行一些繁琐的重新编码。

这是一个说明问题的共享电子表格:https://docs.google.com/spreadsheets/d/1xJoOf0DJBRUTbaskjKsly3pAGNJ72sT_EV8Tn246Ufo/edit?usp=sharing

google issuetracker

上也报告“服务错误”

根据@Tyler2P 的评论,我创建了一个解决方法,将 //repace cell values with text 中的部分替换为以下代码:

var destSheet = destSpreadsheet.getSheets()[0];
var destSheet = destSpreadsheet.getSheetByName(sheetName);
var sourceRange = sourceSheet.getRange(1,1,sourceSheet.getMaxRows(),sourceSheet.getMaxColumns()); 
var sourceRange1 = sourceSheet.getRange(1,1,3,sourceSheet.getMaxColumns());
var sourceRange2 = sourceSheet.getRange(7,1,(sourceSheet.getMaxRows()-7),sourceSheet.getMaxColumns());
var sourcevalues = sourceRange.getValues();
var sourcevalues1 = sourceRange1.getValues();
var sourcevalues2 = sourceRange2.getValues();
var destRange = destSheet.getRange(1, 1, destSheet.getMaxRows(), destSheet.getMaxColumns());
var destRange1 = destSheet.getRange(1,1,3,sourceSheet.getMaxColumns());
var destRange2 = destSheet.getRange(7,1,(sourceSheet.getMaxRows()-7),sourceSheet.getMaxColumns());

destRange1.setValues(sourcevalues1);
destRange2.setValues(sourcevalues2);