首页 > 解决方案 > 分配给宏按钮时,for循环无法正常工作?

问题描述

由于我刚刚开始学习使用 Google Apps 脚本,因此对术语中的任何混淆表示歉意。我最近创建了一个 Google 表格电子表格报告,以帮助监控帐户并记录任何客户设备的任何问题(单击此处查看所述文件)。我在“封面”表上设置了一个“开始报告”按钮,该按钮应该触发下面列出的功能;

function startReport()
{
  hideSheet();
  addXColumns();
};

function hideSheet() //Hides Coversheet from user's view.
{
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('A3:B5').activate();
  spreadsheet.getActiveSheet().hideSheet();
};

function addXColumns() //Adds columns based on the fleet size inputted by the user.
{
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getActiveSheet();
  var fleetSize = sheet.getRange(3,3).getValue();

  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Report'), true);
  spreadsheet.getRange('D:D').activate();

  for (var i = 0; i < fleetSize; i++) //Performs steps through for loop until counter reaches fleetSize number based on user input.
  {
    spreadsheet.getActiveSheet().insertColumnsAfter(spreadsheet.getActiveRange().getLastColumn(), 1);
    spreadsheet.getActiveRange().offset(0, spreadsheet.getActiveRange().getNumColumns(), spreadsheet.getActiveRange().getNumRows(), 1).activate();
    spreadsheet.getActiveRangeList().setBorder(true, true, true, true, true, true, '#000000', SpreadsheetApp.BorderStyle.SOLID);
    spreadsheet.getRange('D6').activate();
    spreadsheet.getActiveRange().autoFill(spreadsheet.getRange('D6:E6'), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
    spreadsheet.getRange('D:D').activate();
  }

  spreadsheet.getRange('E5').activate();
};

执行时,“报告”表应该根据来自“封面”的用户输入(车队大小)在 D 列之后插入新列。当 UI 中选择的活动工作表是“报告”工作表时,此脚本会正确运行。但是,每次我在“封面”中运行脚本时,脚本都会运行函数,但不会在“报告”表中填充新列。从我可以诊断的情况来看,错误似乎在此某处;

function hideSheet() //Hides Coversheet from user's view.
{
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('A3:B5').activate();
  spreadsheet.getActiveSheet().hideSheet();
};

function addXColumns() //Adds columns based on the fleet size inputted by the user.
{
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getActiveSheet();
  var fleetSize = sheet.getRange(3,3).getValue();

  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Report'), true);
  spreadsheet.getRange('D:D').activate();

在执行 hideSheet() 和 addXColumns() 函数后,工作表似乎没有主动从“Coversheet”切换到“Report”。变量fleetSize的值是“Coversheet”中的C3,而不是“Report”中的C3(这是我正在寻找的)。

对此的任何见解将不胜感激!

标签: for-loopgoogle-apps-scriptgoogle-sheets

解决方案


  • 您想通过按下“开始报告”按钮来运行startReport()表格中的功能。Coversheet
  • 在您共享的电子表格中,“开始报告”按钮的功能名称为myFunction。但是你想运行startReport().
  • 您想通过修改脚本来实现这一点。

如果我的理解是正确的,这个答案怎么样?请认为这只是几个可能的答案之一。

修改点:

  • 在您的脚本中,使用了活动工作表。所以它使用getSheetByName().
    • 这反映在hideSheet()addXColumns()上。

修改后的脚本:

当您的脚本被修改时,请进行如下修改。

从:
function hideSheet() //Hides Coversheet from user's view.
{
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('A3:B5').activate();
  spreadsheet.getActiveSheet().hideSheet();
};
到:
function hideSheet() //Hides Coversheet from user's view.
{
  var sheet = SpreadsheetApp.getActive().getSheetByName("Report");
  sheet.hideSheet();
};

从:
function addXColumns() //Adds columns based on the fleet size inputted by the user.
{
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getActiveSheet();
到:
function addXColumns() //Adds columns based on the fleet size inputted by the user.
{
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getSheetByName("Report");

参考:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。


推荐阅读