从 Google 幻灯片中读取 Google Sheet 获取权限错误

Read Google Sheet from Google Slides getting permission error

                        NEW INFORMATION  

2020 年 11 月 17 日 - 我可以从脚本 运行 onOpen 而不会出现权限错误。我可以 运行 从脚本或菜单中显示数据的函数(在我从脚本中 运行 onOpen 之后)。我认为代码没有任何更改,但又出现了。清单肯定没变。

//@NotOnlyCurrentDoc
function globalVariables(){ 
  var variables = {
                   // this is the Connect Four Game
                   sheetId: '1fmZCittj4ksstmhh8_t0O0csj8IDdwi9ohDDL5ZE7VA',   
                   sheetUrl: 'https://docs.google.com/spreadsheets/d/1fmZCittj4ksstmhh8_t0O0csj8IDdwi9ohDDL5ZE7VA/edit?usp=sharing'
                  };
  return variables; //return a dictionary of keys and values
}

function onOpen() {
  Logger.log("In onOpen" );
  var variables = globalVariables();   //load the Global variables 
  Logger.log("In onOpen sheetUrl from globalVariables: " + variables.sheetUrl );
  try  {
  
//      var ss = SpreadsheetApp.openByUrl(variables.sheetUrl);
    var ss = SpreadsheetApp.openById(variables.sheetId)
    if (!ss) {
      SlidesApp.getUi().alert("Spreadsheet not found!");
      return;
    }  
  }    catch(e)    {
      SlidesApp.getUi().alert(e);
      return;
  }

  SlidesApp.getUi()
      .createMenu( 'Ask ?')
      .addItem('BE1','BE1')
      .addItem('BE2','BE2')
      .addItem('BE3','BE3')
      .addItem('BE4','BE4')
      .addToUi(); 
   
  prepareQuestions(ss);
  Logger.log("After prepareQuestions");
  setupSheets(ss);  // only want to do this once
  Logger.log("After setupSheets");
}

function setupSheets(ss) {

SlidesApp.getUi().alert("setupSheets() triggered");

  var nextI = '1'; 
  var cache = CacheService.getUserCache();
  cache.put('nextI', nextI);
console.log("1. cache.put('nextI') = " + nextI);
SlidesApp.getUi().alert("End onOpne) = ");
}

function BE1() {
SlidesApp.getUi().alert("BE1() triggered");
  var variables = globalVariables();   //load the Global variables 
  var sheetName = 'BE1';
  var sheet = SpreadsheetApp.openById(variables.sheetId).getSheetByName('BE1');
  if (!sheet) {
    Logger.log("Sheet BE1 not found");
    SlidesApp.getUi().alert("Sheet BE1 not found");
    return;
  } 
  getNextQ(sheet);
  SlidesApp.getUi().alert("end BE1 function");
}

我是电子表格和幻灯片的创建者。它们位于“我的云端硬盘”中的同一文件夹中。

我已将 Oauth 添加到幻灯片中的清单中:

{
  "timeZone": "America/Mexico_City",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "oauthScopes": [
    "https://www.googleapis.com/auth/spreadsheets.readonly"
  ]
}

我尝试通过 ID 和 URL 打开电子表格。错误是:

异常:您没有调用 SpreadsheetApp.openById 的权限。所需权限:https://www.googleapis.com/auth/spreadsheets

我试过创建一个触发器(我不知道这是干什么用的)但是在创建它时,唯一的选项是基于时间的,这似乎没有用。触发器的存在不会改变错误。

幻灯片绑定的代码

//@NotOnlyCurrentDoc
function globalVariables(){ 
  var variables = {
                   // this is the Connect Four Game
                   sheetId: '1fmZCittj4ksstmhh8_t0O0csj8IDdwi9ohDDL5ZE7VA',   
                   sheetUrl: 'https://docs.google.com/spreadsheets/d/1fmZCittj4ksstmhh8_t0O0csj8IDdwi9ohDDL5ZE7VA/edit?usp=sharing'
                  };
  return variables; //return a dictionary of keys and values
}

//function installableOpen()    {   // never starts
function onOpen() {
  var variables = globalVariables();   //load the Global variables 
  try  {
  
//      var ss = SpreadsheetApp.openByUrl(variables.sheetUrl);
    var ss = SpreadsheetApp.openById(variables.sheetId)
    if (!ss) {
      SlidesApp.getUi().alert("Spreadsheet not found!");
      return;
    }  
  }    catch(e)    {
      SlidesApp.getUi().alert(e);
      return;
  }
 etc...

我添加了“//@NotOnlyCurrentDoc”,因为某些地方推荐这样做。

共享电子表格的状态

访问电子表格的目的是获取数据以使用 showModalDialog 在 html 中显示。我浏览了有关自定义菜单、对话框和边栏的信息,再到 Google 文档、表格和表单、自定义函数和宏、Web 应用程序、附加组件,但我不了解其中任何一个。我希望保持这个简单。自定义函数说它不能显示 html (https://developers.google.com/apps-script/guides/sheets/functions) 所以那是没用的。

任何想法表示赞赏。

作为评论的结果,我按如下方式更改了清单,但错误没有改变。

{
  "timeZone": "America/Mexico_City",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "oauthScopes": [
    "https://www.googleapis.com/auth/spreadsheets"
  ]
}  

================== 我在删除触发器后收到了此类电子邮件

如错误信息所述:

对于方法

SpreadsheetApp.openById()

您需要提供范围

https://www.googleapis.com/auth/spreadsheets

而不是

https://www.googleapis.com/auth/spreadsheets.readonly

如果您不想提供此范围,请考虑将您的脚本绑定到电子表格并使用方法

SpreadsheetApp.getActive()

接受范围

https://www.googleapis.com/auth/spreadsheets.currentonly

疯狂修复 - 在连接到电子表格之前,我连接到脚本绑定到的幻灯片!纯属偶然发现,但权限错误消失了。

function onOpen() {

  var deck = SlidesApp.getActivePresentation();
  var slides = deck.getSlides();
  var presLen = slides.length;
  Logger.log("num slides: " + presLen );

  var variables = globalVariables();   //load the Global variables 
  if (!variables.sheetId)  {
    Logger.log("SheetId not retrieved from global variables!");
    return;
  }    
  
  try  {
    var ss = SpreadsheetApp.openById(variables.sheetId);
    if (!ss)  {
      Logger.log("The data spreadsheet does not exist");
      SlidesApp.getUi().alert("The data spreadsheet does not exist"  + variables.sheetId );
      return;
    }
  }  catch (e)  {
    Logger.log("    in catch for openBYId: "  + variables.sheetId );
    SlidesApp.getUi().alert(e);
    return;
  }