1

我们的网站提供了我们用作活动名册的 CSV 文件,但它们包含的数据太多。没有可行的方法来更改导出中包含的内容,因此管理员助理必须编辑和格式化以进行打印。它重复且耗时,所以我认为这是学习 Google Apps 脚本的最佳时机。

感谢这里分享的关于堆栈溢出的令人难以置信的知识,像我这样的菜鸟可以拼凑出一个脚本来满足我的需要!只需使用其他答案的片段,我就能够自动化:

  • 删除不需要的和空的列
  • 重命名和自动调整列大小
  • 按姓氏列排序
  • 生成保存在同一 Drive 目录中的可打印 PDF。

但是现在我在测试和部署脚本作为插件时遇到了麻烦,以便我的同事可以使用它。当我运行“作为插件的测试”时,工作表打开,但没有任何反应。我已经尝试了安装配置的所有变量,并搜索了其他有同样问题的人,但找不到任何东西,所以我认为问题出在我的某个地方——脚本或用户错误。

一旦我让它正确测试,我不完全确定如何将插件正确部署到我们的域并正确获取所有权限等设置。我已经阅读了,现在我比以往任何时候都更加困惑!所以两个问题:

  • 我的测试出了什么问题?
  • 一旦测试成功,我可以让我们域的所有应用程序用户使用该脚本的最简单方法是什么?

这是脚本:

function expCalc() {
  DeleteColumns();
  RemoveEmptyColumns();
  RenameColumns();
  ResizeColumns();
  Sort();
  SavePDF();
}

//delete unwanted columns
function DeleteColumns() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var dataRange = sheet.getRange("A1:AH200");
  var data = sheet.getRange("A1:AH200");
  var values = data.getValues();
  var numRows = values.length;
  var numCols = values[0].length;
  for (var col = numCols - 1; col > 0; col--) {
    for (var row = 0; row < numRows; row++) {
      switch (values[row][col]) {
        case "Group":
        case "ID":
        case "Reg ID":
        case "Reg Date":
        case "Type of Payment":
        case "Transaction ID":
        case "Coupon Code":
        case "# Attendees":
        case "Date Paid":
        case "Price Option":
        case "Event Date":
        case "Event Time":
        case "Website Check-in":
        case "Tickets Scanned":
        case "Check-in Date":
        case "Seat Tag":
        case "BLS Add-on items (received at class):":
        case "Company Name":
        case "Address":
        case "Address 2":
        case "City":
        case "State":
        case "Zip":

          sheet.deleteColumn(col + 1); // delete column in sheet (1-based)
          continue; // continue with next column
          break; // can't get here, but good practice
      }
    }
  }
}

//Remove Empty Columns
function RemoveEmptyColumns() {
  var sh = SpreadsheetApp.getActiveSheet();
  var maxColumns = sh.getMaxColumns();
  var lastColumn = sh.getLastColumn();
  sh.deleteColumns(lastColumn + 1, maxColumns - lastColumn);
}

//Rename Columns
function RenameColumns() {
  SpreadsheetApp.getActiveSheet().getRange('A1').setValue('Type');
  SpreadsheetApp.getActiveSheet().getRange('B1').setValue('Paid');
  SpreadsheetApp.getActiveSheet().getRange('C1').setValue('Price');
  SpreadsheetApp.getActiveSheet().getRange('D1').setValue('Amt');
  SpreadsheetApp.getActiveSheet().getRange('E1').setValue('Class');
  SpreadsheetApp.getActiveSheet().getRange('F1').setValue('First Name');
  SpreadsheetApp.getActiveSheet().getRange('G1').setValue('Last Name');
  SpreadsheetApp.getActiveSheet().getRange('H1').setValue('Email');
  SpreadsheetApp.getActiveSheet().getRange('I1').setValue('Phone');
}

//Auto-Resize Columns
function ResizeColumns() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];

  sheet.autoResizeColumn(1);
  sheet.autoResizeColumn(2);
  sheet.autoResizeColumn(3);
  sheet.autoResizeColumn(4);
  sheet.autoResizeColumn(5);
  sheet.autoResizeColumn(6);
  sheet.autoResizeColumn(7);
  sheet.autoResizeColumn(8);
  sheet.autoResizeColumn(9);
}

//Sort by last name
function Sort() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheets()[0];
  sheet.sort(7);
}

//Save PDF
function SavePDF(optSSId, optSheetId) {

  // If a sheet ID was provided, open that sheet, otherwise assume script is
  // sheet-bound, and open the active spreadsheet.
  var ss = (optSSId) ? SpreadsheetApp.openById(optSSId) : SpreadsheetApp.getActiveSpreadsheet();

  // Get URL of spreadsheet, and remove the trailing 'edit'
  var url = ss.getUrl().replace(/edit$/, '');

  // Get folder containing spreadsheet, for later export
  var parents = DriveApp.getFileById(ss.getId()).getParents();
  if (parents.hasNext()) {
    var folder = parents.next();
  } else {
    folder = DriveApp.getRootFolder();
  }

  // Get array of all sheets in spreadsheet
  var sheets = ss.getSheets();

  // Loop through all sheets, generating PDF files.
  for (var i = 0; i < sheets.length; i++) {
    var sheet = sheets[i];

    // If provided a optSheetId, only save it.
    if (optSheetId && optSheetId !== sheet.getSheetId()) continue;

    //additional parameters for exporting the sheet as a pdf
    var url_ext = 'export?exportFormat=pdf&format=pdf' //export as pdf
      +
      '&gid=' + sheet.getSheetId() //the sheet's Id
      // following parameters are optional...
      +
      '&size=letter' // paper size
      +
      '&portrait=false' // orientation, false for landscape
      +
      '&fitw=true' // fit to width, false for actual size
      +
      '&sheetnames=false&printtitle=false&pagenumbers=false' // hide optional headers and footers
      +
      '&gridlines=true' // hide/show gridlines
      +
      '&fzr=false'; // do not repeat row headers (frozen rows) on each page

    var options = {
      headers: {
        'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()
      }
    }

    var response = UrlFetchApp.fetch(url + url_ext, options);

    var blob = response.getBlob().setName(ss.getName() + ' - ' + sheet.getName() + '.pdf');

    folder.createFile(blob);
  }
}

/**
 * Dummy function for API authorization only.
 * From: https://stackoverflow.com/a/37172203/1677912
 */
function forAuth_() {
  DriveApp.getFileById("Just for authorization"); // https://code.google.com/p/google-apps-script-issues/issues/detail?id=3579#c36
}
4

1 回答 1

2

非常适合附加组件。为了使其作为附加组件工作,您需要创建一个onOpen()触发器,以便用户可以与您的代码进行交互。

请参阅onOpen()此处的文档:https ://developers.google.com/apps-script/guides/triggers/#onopen

在此处查看示例:https ://developers.google.com/apps-script/add-ons/#user_interfaces

于 2017-09-06T04:29:31.930 回答