问题
I have a google sheet with two long columns(image 1) of results(say 1 up to 1500 records) and column 2 I have QR codes generated by a formula.
Now I need to export or print it to a pdf file, but I like to break the long columns so that the pdf file is filled with 8 columns(image 2) so that there is no paper wasted when printed. As it is, if print the page it would give me a lot of empty space.
回答1:
From what I understand, you are trying to break the 1 long column into 4 columns. The following script would separate the long column into 4 column, as evenly as possible.
function BreakColumn() {
var app = SpreadsheetApp;
var ss = app.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var range = sheet.getDataRange();
var intlastrow = range.getLastRow();
var expectedcol = 4; //num of column wanted
var z = expectedcol;
for (var i = expectedcol-1; i > 0; i--) {
var range = sheet.getDataRange();
var lastrow = range.getLastRow();
var breakcount = intlastrow/expectedcol * i;
Logger.log(i,lastrow,breakcount);
var cut = sheet.getRange(breakcount,1,lastrow,1);
cut.copyTo(sheet.getRange(1,z));
z--;
cut.clear();
}
}
Do update if it works and if you need any adjustment.
回答2:
There are several options to export selected columns from Spreadsheets to PDF.
The easiest is probably to specify the desired range to export in the export URL
Sample:
function hideColumns(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Sheet1');
var url = "https://docs.google.com/spreadsheets/d/" + ss.getId() + "/export?";
var parameters = 'exportFormat=pdf&format=pdf' // export as pdf / csv / xls / xlsx
+ '&size=letter' // paper size legal / letter / A4
+ '&portrait=true' // orientation, false for landscape
+ '&fitw=true&source=labnol' // fit to page width, false for actual size
+ '&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
+ '&gid='; // the sheet's Id
var token = ScriptApp.getOAuthToken();
var lastColumn = sheet.getLastColumn();
var lastRow = sheet.getLastRow();
var columnNumber = 4;
for (var i = 0; i < Math.ceil(lastColumn / columnNumber); i++){
var startColumn = (columnNumber*i) + 1;
var range = sheet.getRange(1, startColumn, lastRow, columnNumber).getA1Notation(); Logger.log(range);
var response = UrlFetchApp.fetch(url + parameters + sheet.getSheetId() + "&range=" + range, {
headers: {
'Authorization': 'Bearer ' + token
}
});
var name = "export selected columns "+i;
DriveApp.createFile(response.getBlob().setName(name));
SpreadsheetApp.flush();
}
}
UPDATE:
To do the opposite - to print 2 columns into 8 columns, you need to:
- modify your sheet data by diving it evenly into the desired amount of columns
- export it as pdf
- move the data back into the original state
Here is a modification of the sample performing this task:
function hideColumns(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Sheet1');
var url = "https://docs.google.com/spreadsheets/d/" + ss.getId() + "/export?";
var parameters = 'exportFormat=pdf&format=pdf' // export as pdf / csv / xls / xlsx
+ '&size=letter' // paper size legal / letter / A4
+ '&portrait=true' // orientation, false for landscape
+ '&fitw=true&source=labnol' // fit to page width, false for actual size
+ '&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
+ '&gid='; // the sheet's Id
// split columns into 8
var token = ScriptApp.getOAuthToken();
var lastColumn = sheet.getLastColumn();
var lastRow = sheet.getLastRow();
var realColumnNumber = 2;
var desiredColumnNumber = 8;
var rowsPerColumn = Math.ceil(lastRow / desiredColumnNumber * realColumnNumber);
for (var i = 0; i < desiredColumnNumber / realColumnNumber; i++){
var startRow = rowsPerColumn * (i+1) + 1;
var range = sheet.getRange(startRow, 1, rowsPerColumn, realColumnNumber);
range.moveTo(sheet.getRange(1, (1 + realColumnNumber * (i+1))));
SpreadsheetApp.flush();
}
// export as pdf
var response = UrlFetchApp.fetch(url + parameters + sheet.getSheetId() + "&range=" + sheet.getDataRange().getA1Notation(), {
headers: {
'Authorization': 'Bearer ' + token
}
});
var name = "export into 4 columns";
DriveApp.createFile(response.getBlob().setName(name));
SpreadsheetApp.flush();
// move columns back into original position
for (var i = 0; i < desiredColumnNumber / realColumnNumber; i++){
var startRow = 1;
var range = sheet.getRange(startRow, (i+1)*realColumnNumber + 1, rowsPerColumn, realColumnNumber);
range.moveTo(sheet.getRange((sheet.getLastRow() + 1), 1));
SpreadsheetApp.flush();
}
}
来源:https://stackoverflow.com/questions/60059929/how-to-print-a-long-goggle-sheets-column-in-fewer-columns