【问题标题】:Google Apps Script Not Loading Functions for Everyone, only meGoogle Apps 脚本不为所有人加载功能,只有我
【发布时间】:2020-02-13 09:39:14
【问题描述】:

打开我的活动 Google 表格时,我的 onSheetOpen / showSidebar 不适用于除我之外的任何人。我已经为自己设置了触发器来启动 onSheetOpen 和 showSidebar,但这不适用于打开电子表格的其他人。谁能帮助弄清楚为什么会这样?下面是我正在使用的代码。

 /**
 * Set up custom sidebar.
 * TRIGGER: spreadsheet event 'on open'
 */
function onSheetOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Actions')
    .addItem("Register interest in current opportunity", 'registerInterest')
    .addItem("Show sidebar", 'showSidebar')
    .addToUi();

  showSidebar();
}

/**
 * Renders the sidebar
 * TRIGGER: spreadsheet event 'on open' & custom menu option
 */
function showSidebar() {
  try {
    var htmlOutput = HtmlService.createHtmlOutputFromFile('sidebar');
    SpreadsheetApp.getUi().showSidebar(htmlOutput);
  } catch(e) {
    // Just ignore - means user doesn't have edit access to sheet
  }
}



/**
 * Main function. Grabs the required data from the currently-selected row, registers interest
 * in that data in a separate sheet, and sends a confirmation email to the user.
 */
function registerInterest() {
  //var spreadsheet = SpreadsheetApp.getActive();
  // These are the attributes we capture and store in the 'interest' sheet
  var who = Session.getActiveUser().getEmail();
  var when = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'yyyy-MM-dd HH:mm:ss');
  var data = getRowOfInterest(SpreadsheetApp.getActiveSheet());
  var id = Utilities.getUuid();
  Logger.log(id)
  if(data.what && data.what.length > 0) {
    // Get the Google Sheets ID of the target 'interest' sheet 
    var id = getConfigValue("InterestSheet");
    if(id) {
      // Now try and open that sheet for updating
      var ss = SpreadsheetApp.openById(id);
      if(ss) {
        var sheet = ss.getSheetByName('Interest');
        if(sheet) {
          // All good; log interest. First, create the new row of data for the target sheet
          sheet.appendRow([ when, who, data.what, data.subject,  data.location, data.industry, data.capabilities ]);
          // Second, grab our 'template' email from config & use that to send a confirmation 
          // email to the person registering their interest
          var body = getConfigValue('InterestEmail');
          MailApp.sendEmail(who, getConfigValue('InterestSubject'), null, { noReply: true, htmlBody: body });
        } else {
          throw Error('can\'t open the \'Interest expressed\' sheet (or it doesn\'t exist)');
        }
      } else {
        throw Error('can\'t open the \'Interest expressed\' sheet');
      }
    } else {
      throw Error('\'Interest expressed\' sheet not specified');
    }
  }
}

/**
 * Utility to derive the required data for registering interest.
 * Called from the registerInterest() function
 */
function getRowOfInterest(sheet) {
  var result = {};
  var row = sheet.getActiveRange().getRow(); // Get the currently-selected row index
  var fullRange = sheet.getRange(row, 1, 1, sheet.getLastColumn()); // Get the entire row of data
  //var fullRange = sheet.getRange(row, 1, 1, 9);
  Logger.log(fullRange.getValues())
  var data = fullRange.getValues();
  if(data[0] && data[0].length > 0) {
    for(var n = 0; n < data[0].length; n++) {
      // Populate specific attributes in the 'result' object - tailor this as you see fit
      if(n==0) result.subject = data[0][n];
      if(n==6) result.what = data[0][n] + ' ';
      //if(n==5 || n==7) result.what += data[0][n] + ' ';
      if(n==7) result.location = data[0][n];
      if(n==11) result.industry = data[0][n];
      if(n==12) result.capabilities = data[0][n];
    }

    result.what += '(' + sheet.getName() + ')';
    result.industry;
    result.capabilities;
    return result;
  }
}

function getSomeRange(){

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var row = sheet.getActiveRange().getRow(); // Get the currently-selected row index

  var myRange = sheet.getRange(row, 1, 1, sheet.getLastColumn());

  //Logger.log("Number of rows in range is "+myRange.getNumRows()+ " Number of columns in range is "+ myRange.getNumColumns());

}
/**
 * Utility to pull specified data from a config sheet. This assumes that a sheet called 'Config' 
 * is populated thus:
 *    Column contains a load of 'key' and column 2 contains the corresponding 'values'
 * Called from registerInterest() function
 */
function getConfigValue(key) {
  var sheet = SpreadsheetApp.getActive().getSheetByName('Config');
  var result;

  if(sheet) {
    // Scan column 1 for key and return value in column 2
    var data = sheet.getDataRange().getValues();
    for(var n = 0; n < data.length; ++n) {
      if(data[n][0].toString().match(key)) result = data[n][1];
    }
  }

  return result;
}

function hideExpiredEvents() {
  var ss=SpreadsheetApp.getActive();
  var sh=ss.getSheetByName('Events');
  var exsh=ss.getSheetByName('Expired Events');
  var sr=2;
  var rg=sh.getRange(sr,1,sh.getLastRow()-sr+1,sh.getLastColumn());
  var vA=rg.getValues();
  Logger.log(vA);
  var dt=new Date();
  var  d=0;//deleted row counter
  var today=new Date(dt.getFullYear(),dt.getMonth(),dt.getDate(0)).valueOf();
  for(var i=0;i<vA.length;i++) {
    if(new Date(vA[i][3]).valueOf()<today) {
      exsh.appendRow(vA[i]);//move to bottom of expired events
      sh.deleteRow(i+sr-d++);//increment deleted row counter
    }
  }
}

【问题讨论】:

  • 您好@Michael,为了让其他用户能够使用您的脚本,您应该授予他们访问和修改您拥有的工作表的权限。此外,用户还必须审查权限并接受它们才能执行脚本。您是否授予了适当的权限?另外,您是如何与其他用户分享您的脚本和工作表的?干杯!
  • 嗨@ale13。我正在尝试向组织内的大约 300 人推广我的工作表。我目前只是在测试阶段。我授予我正在测试的那些人编辑权限,但我的触发器只对我有用。我们有一个内部网络,所以我可以很容易地将同事添加到工作表中,然后尽可能多地为他们提供访问权限,而不是让他们成为“所有者”。为帮助干杯!

标签: javascript google-apps-script google-sheets triggers


【解决方案1】:

很遗憾,您遇到的问题似乎是一个错误。

在这种情况下,您可以通过点击问题旁边的 问题跟踪器 here 上为问题加注星标编号并发表评论,同时说明您受到该问题的影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 2013-09-28
    相关资源
    最近更新 更多