【问题标题】:GAS Function doGet does not trigger on Page embed when embedded on a new page (http mixed content)嵌入新页面(http混合内容)时,GAS函数doGet不会在页面嵌入时触发
【发布时间】:2025-12-31 23:05:02
【问题描述】:

我为我公司的内部 Google 协作平台 Intranet 创建了以下 GAS 代码。它会提取时间和登录用户并发布他们查看过的页面,以便我们确认我们的员工正在使用 Intranet 工具以及哪些信息对他们最有价值。当我们向 Intranet 添加新内容时,我复制了这个脚本并使用插入 >> Google Apps 脚本提示将其嵌入到新的 Google 站点页面中。是的,我确保启用了 Admin SDK 和 Google 表格服务。我什至可以在 Apps-Script 环境中运行 doGet 函数,一切都像一个魅力。

由于我无法弄清楚的原因,该脚本在嵌入新页面时不起作用。我尝试了以下步骤:

1) 确认脚本当前正在页面上运行 [成功]

2) 创建一个新的 Google 公告页面

3) 将第 1 步中的确切脚本嵌入到新的 Google 页面中

4) 刷新新页面并检查脚本是否填充了日志表 [FAILED]

下面是我的代码:

/*
This Script Needs the following Advanced Services to function:

  Admin Directory
  
  This Script Could be used with the following library, but is not required:

  BetterLog: MYB7yzedMbnJaMKECt6Sm7FLDhaBgl_dE

  
*/ 

//PropertiesService.getScriptProperties().setProperties({'LogSheet':'1hw3f5ywdbF6JuRd1lPzrCthNaMb5InHl9VBP-xxxxxx', 'ErrSheet': '1_PHc1EU0JYLJirMceAP_enktaP3HJmGHS407Oxxxxx'});

try{
//-------------------------------------------------
  
var ACTIVE = true;
 
  
var PAGE = 'Name of the Page to Track';
var TYPE = 'Article';
var GROUP = 'Department Name';
var URL = 'https://sites.google.com/a/Intranet/URL for the Article';
//--------------------------------------------------  

if(ACTIVE){ 
var errorTemplate = 'Analytics_Error_Log_started_';
var logTemplate = 'Analytics_Log_started_'
var now = new Date();
var date = Utilities.formatDate(now, 'CST', 'MM/dd/YYYY');
var time = Utilities.formatDate(now, 'CST', 'hh:mm:ss a');
var user = AdminDirectory.Users.get(Session.getActiveUser().getEmail());
var scriptStore = PropertiesService.getScriptProperties().getProperties();
var errorFolder = '0B6w6hIuCv6BtdHl1S09kbxxxx';
var logFolder = '0B6w6hIuCv6BtWldmYjdEbxxxxx';
var logSheet = getSheet('LogSheet', logTemplate, logFolder);
var errSheet = getSheet('ErrSheet', errorTemplate, errorFolder);
var scriptStore = PropertiesService.getScriptProperties().getProperties();
var errSheet = SpreadsheetApp.openById(scriptStore.ErrSheet).getSheets()[0];
var logSheet = SpreadsheetApp.openById(scriptStore.LogSheet).getSheets()[0];
   }
 }
catch(e){Logger.log('Compiler Error in File TK-'+PAGE+': '+e);}
  
function doGet(){
     
     try{if(ACTIVE){
              logSheet.appendRow([date, time, user.name.givenName, user.name.familyName, PAGE, TYPE, GROUP, user.primaryEmail, URL]);
     }}
  
     catch(e) {report(e);}
}

function report(e){
Logger.log(date+' '+time+' '+user.primaryEmail+' at '+PAGE+' : '+e);
errSheet.appendRow([date, time, user.primaryEmail, PAGE, e]);

  
}

function getSheet(scriptStoreVal,template, folderId){
  var sheetId = scriptStore[scriptStoreVal];
  try{var book = SpreadsheetApp.openById(sheetId);}
  catch(e){var sheetId = generateSheet(template+date, folderId);}
  
  var book = SpreadsheetApp.openById(sheetId);
  var sheets = book.getSheets();  
  var sheet = sheets[0];
  
  if(sheet.getLastRow() >= 50000){
    var fileList = DriveApp.getFolderById(folderId).getFiles();
    var found = false;
    while(fileList.hasNext())
    { 
      var testFile = fileList.next().getId();
      if (SpreadsheetApp.openById(testFile).getSheets()[0].getLastRow() < 50000)
      { 
        var book = SpreadsheetApp.openById(testFile)
        var sheet = book.getSheets()[0];
        var sheetId = testFile;
        var found = true;}
    }
    
    if(!found)
    {
      var sheetId = generateSheet(template+date, folderId);
      var book = SpreadsheetApp.openById(sheetId);
      var sheets = book.getSheets();
      var sheet = sheets[0];
    }
    
    for (var s = 1; s < book.getNumSheets(); s++)
    {
      book.deleteSheet(sheets[s]);
    }
  }
  if(book.getName().indexOf('Er') > -1)
     {
       try{sheet.deleteColumns(4,22); sheet.appendRow(['Error Message: Press Ctrl Down to scroll to end. 50K Max'])}
      catch(e){/*Sheet does not have 26 columns. We are set*/}
    }
  else
     {
       try{sheet.deleteColumns(8, 17); sheet.appendRow(['Date', 'Time', 'First Name', 'Last Name', 'Page', 'Type', 'Group','Email', 'URL']);}
       catch(e){/*Sheet does not have 26 columns. We are set*/}
    }
  
     var patch = {}; patch[scriptStoreVal] = sheetId;
     PropertiesService.getScriptProperties().setProperties(patch);
  
  return sheet;
}


function generateSheet(sheetName, folderId)
{
  var origId = SpreadsheetApp.create(sheetName).getId();
  var file = DriveApp.getFileById(origId);
  var start = file.getParents().next();
  DriveApp.getFolderById(folderId).addFile(file);
  start.removeFile(file);
  return origId;
}

谁能帮我弄清楚为什么这个仍然适用于我以前的页面的功能在我的新页面上不起作用?

谢谢, 纳撒尼尔

更新:根据 noogui 的建议,我打开 Chrome 调试控制台并注意到该页面将应用程序脚本插入标记为通过 http 的混合请求。这是当前页面的 HTML:

<div>


<div></div>
<br>
</div>
<div></div>
<div></div>
<div><img src="https://www.google.com/chart?chc=sites&amp;cht=d&amp;chdp=sites&amp;chl=%5B%5BGoogle+Apps+Script'%3D20'f%5Cv'a%5C%3D0'10'%3D499'0'dim'%5Cbox1'b%5CF6F6F6'fC%5CF6F6F6'eC%5C0'sk'%5C%5B%22Apps+Script+Gadget%22'%5D'a%5CV%5C%3D12'f%5C%5DV%5Cta%5C%3D10'%3D0'%3D500'%3D297'dim'%5C%3D10'%3D13'%3D500'%3D297'vdim'%5Cbox1'b%5Cva%5CF6F6F6'fC%5CC8C8C8'eC%5C'a%5C%5Do%5CLauto'f%5C&amp;sig=zdJ4UDJFmGvXXHTFJf3RLHWWKks" data-props="align:left;showBorder:false;showBorderTitle:false;borderTitle:Apps Script Gadget;height:200" id="388247003045773" data-type="maestro" class="sites-placeholder-maestro" data-origsrc="https://script.google.com/a/intranet/macros/s/AKfycbxIpjE0HKKYBWpB16fB3D7BPeLtP-Y-FXLnWk3l-w853qSloes/exec" width="500" height="300" style="display: block; text-align: left;"></div>
<br>

如您所见,图像占位符和脚本本身是通过 HTTPS 引用的,那么提供了什么?我不明白为什么它会标记混合 http 错误。

【问题讨论】:

  • 你的错误日志是怎么说的?
  • 在 Chrome 开发者控制台中:混合内容:“sites.google.com/a/intranet/test/test3”处的页面是通过 HTTPS 加载的,但请求了不安全的资源“sites.google.com/a/intranet/sites/system/errors/…”。此请求已被阻止;内容必须通过 HTTPS 提供。请注意,当我在第一次使用它的页面上运行 SAME 脚本时,这不会显示,它工作正常。我认为我正确地附加了它,所以我不明白为什么它现在不起作用。

标签: google-apps-script google-sheets-api google-sites mixed-content


【解决方案1】:

我不确定这是否有帮助,但对于我们的谷歌网站内部网,我们使用谷歌分析。它可以处理所有事情,甚至现在还有人工智能来帮助分析数据。在“管理站点设置”下,有一个插入分析密钥的地方。它是完全免费且动态的,因此您添加的任何新页面/文章都会被自动跟踪。

【讨论】:

  • 谢谢,Supertopoz,但我们不是用它来分析公共站点访问,而是记录个别员工访问页面时的情况。由于隐私问题,Google Analytics(分析)不允许这种级别的粒度,因此我们无法使用它。
最近更新 更多