有没有办法让应用程序脚本使用一个人拥有的电子表格来查找另一个用户的数据?

时间:2013-06-07 19:01:08

标签: google-apps-script

这是我目前的代码:

function doGet() { 
var app = UiApp.createApplication().setTitle('When Am I Eligible?');
var panel = app.createVerticalPanel().setHeight("400px").setWidth("400px");
//var submitButton = app.createButton('Check');


var key= '???'
var ss = SpreadsheetApp.openById(key);
  var sh = ss.getSheetByName('SHEET');
  var last=ss.getLastRow();
  var data=sh.getRange(1,1,last,2).getValues();
  var valB= Session.getEffectiveUser();
  for(nn=0;nn<data.length;++nn){
    if (data[nn][1]==valB){
      var final = data[nn][0]
      break} ;// if a match in column B is found, break the loop
      }
// var finish = data[nn][0];
 var app = UiApp.getActiveApplication();
 //var statusLabel = app.createLabel().setVisible(true).setText(String.valueOf(finish))
 var answer = app.createLabel("BRO").setVisible(true).setText(final)
 panel.add(answer);
 app.add(panel);
  return app;
}

它在我之下运行良好,但如果在我们的域下登录的其他人使用它,则表示他们需要与他们共享电子表格。电子表格的性质可以防止这种情况发生。反正有吗?

3 个答案:

答案 0 :(得分:1)

通过编写两个脚本,在这种情况下有一种解决方法。

脚本1: 这是您运行并访问电子表格的脚本。像

这样的东西
function doGet(e){
  var key= '0Anzdf0g-SCsDdDF1WEVrYjZyclIzMkdmZjVYUTdXN2c'
  var ss = SpreadsheetApp.openById(key);
  var sh = ss.getSheetByName('SHEET');
  var last=ss.getLastRow();
  var data=sh.getRange(1,1,last,2).getValues();

  var valB = e.parameter.user; //Read it from e.

  for(nn=0;nn<data.length;++nn){
    if (data[nn][1]==valB){
      var final = data[nn][0]
      break} ;// if a match in column B is found, break the loop
      }
  return ContentService.createTextOutput(final);
}

脚本2: 此脚本以运行您调用脚本1

的UI的用户身份运行
function doGet() { 
var app = UiApp.createApplication().setTitle('When Am I Eligible?');
var panel = app.createVerticalPanel().setHeight("400px").setWidth("400px");
//var submitButton = app.createButton('Check');

var final = UrlFetchApp.fetch('URL OF SCRIPT 1 PUBLISHED AS A SERVICE');
// var finish = data[nn][0];
 var app = UiApp.getActiveApplication();
 //var statusLabel = app.createLabel().setVisible(true).setText(String.valueOf(finish))
 var answer = app.createLabel("BRO").setVisible(true).setText(final)
 panel.add(answer);
 app.add(panel);
  return app;
}

答案 1 :(得分:0)

简短的回答是否定的。

一种可能的解决方法是将数据存储在scriptdB中,该数据链接到脚本,因此继承了应用程序的访问权限。

该数据库应填充源电子表格中的数据,并在每次修改电子表格时重新同步(此过程可以通过电子表格中的某些触发器自动完成)

当然,它会暗示您的脚本会有一些深刻的变化,但保证数据隐私是值得的。

这里有一个非常简单的例子,我用一个小代码从SS获取2列数据:

function getlistFromSS(){
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sh = ss.getSheets()[0];
  var last =  ss.setActiveSheet(ss.getSheets()[0]).getLastRow();
  var list = sh.getRange(1,1,last,2).getValues(); 
  var key = [] ; var value = []
  deleteDb()
    for(cc=0;cc<list.length;++cc){
      key.push(list[cc][0]);
      value.push(list[cc][1]);
      }
    for(cc=0;cc<key.length;++cc){
      var db = ScriptDb.getMyDb()
      db.save({name:key[cc], url:value[cc]})    
        Logger.log(key[cc]+'   '+value[cc])
      }
    }

答案 2 :(得分:0)

我相信我已修复它,似乎当我将电子表格的共享设置设置为域内链接的任何人时,访问该页面的域内的人都会看到脚本正确运行而不会将其添加到其驱动器中。谢谢你的帮助。