Google电子表格:任何人都可以编辑,但无法保存更改

时间:2017-08-04 08:29:15

标签: google-apps-script google-sheets

我想在游乐场模式的网页上发布Google电子表格,以便访问者能够编辑内容,更改公式等,但所有这些更改必须保持在本地状态,不会保存在原始Google电子表格中。< / p>

是否可以发布和嵌入此类Google电子表格,例如为最终用户禁用“保存”功能,即无法自动保存更改,也无法手动保存?

即使涉及Google Apps脚本,任何解决方案都会这样做!请指教。感谢。

2 个答案:

答案 0 :(得分:5)

在允许人们编辑的同时保持主电子表格完整性的简单方法是在点击链接时强制复制。

您的电子表格至少需要共享设置中的查看权限。然后,抓住网址:

https://docs.google.com/spreadsheets/d/SOME_BIG_LONG_KEY/view

更改&#34;查看&#34;最后是&#34;复制&#34;:

https://docs.google.com/spreadsheets/d/SOME_BIG_LONG_KEY/copy

系统会要求用户登录并将副本保存到其云端硬盘中。你的主人保持不变,每个人都有一份工作表的副本,你不需要一个大的脚本来管理变更。

话虽如此,如果你对主人进行了更改,他们就不会反映在副本中,因为它是一个新文件。

答案 1 :(得分:2)

可以将电子表格的某些功能放在Web应用程序中。这个例子是你想要的一个微不足道的开始。至于可以通过创建所需电子表格的副本来禁用保存,并在您离开Web应用程序时通过DriveApp删除它(不知道如何操作)。这可能是可能的,但我的猜测是,这是很多工作,我不确定它是否会像使用标准电子表格一样好。 Brian Bennet的解决方案可能是一个更好的主意,但随后该用户会保留您无法控制的电子表格副本。所以这可能不是你想要的。

Code.gs:

var SSID='SpreadsheetID';
var sheetName='Sheet Name';
function htmlSpreadsheet(mode)
{
  var mode=(typeof(mode)!='undefined')?mode:'dialog';
  var br='<br />';
  var s='';
  var hdrRows=1;
  var ss=SpreadsheetApp.openById(SSID);
  var sht=ss.getSheetByName(sheetName);
  var rng=sht.getDataRange();
  var rngA=rng.getValues();
  s+='<table>';
  for(var i=0;i<rngA.length;i++)
  {
    s+='<tr>';
    for(var j=0;j<rngA[i].length;j++)
    {
      if(i<hdrRows)
      {
        s+='<th id="cell' + i + j + '">' + '<input id="txt' + i + j + '" type="text" value="' + rngA[i][j] + '" size="10" onChange="updateSS(' + i + ',' + j + ');" />' + '</th>';
      } 
      else
      {
        s+='<td id="cell' + i + j + '">' + '<input id="txt' + i + j + '" type="text" value="' + rngA[i][j] + '" size="10" onChange="updateSS(' + i + ',' + j + ');" />' + '</th>';
      }
    }
    s+='</tr>';
  }
  s+='</table>';
  //s+='<div id="success"></div>';
  s+='</body></html>';
  switch (mode)
  {
    case 'dialog':
      var userInterface=HtmlService.createHtmlOutputFromFile('htmlss').setWidth(1000).setHeight(450);
      userInterface.append(s);
      SpreadsheetApp.getUi().showModelessDialog(userInterface, 'Spreadsheet Data for ' + ss.getName() + ' Sheet: ' + sht.getName());
      break;
    case 'web':
      var userInterface=HtmlService.createHtmlOutputFromFile('htmlss').setWidth(1000).setHeight(450);
      return userInterface.append(s).setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
   }
}

function updateSpreadsheet(i,j,value)
{
  var ss=SpreadsheetApp.openById(SSID);
  var sht=ss.getSheetByName(sheetName);
  var rng=sht.getDataRange();
  var rngA=rng.getValues();
  rngA[i][j]=value;
  rng.setValues(rngA);
  var data = {'message':'Cell[' + Number(i + 1) + '][' + Number(j + 1) + '] Has been updated', 'ridx': i, 'cidx': j};
  return data;
}

function doGet()
{
  var output=htmlSpreadsheet('web');
  return output;
}

htmlss.html:

<!DOCTYPE html>
<html>
  <head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <script>
    $(function() {

    });
    function updateSS(i,j)
    {
      var str='#txt' + String(i) + String(j);
      var value=$(str).val();
      $(str).css('background-color','#ffff00');
      google.script.run
         .withSuccessHandler(successHandler)
         .updateSpreadsheet(i,j,value)
    }
    function successHandler(data)
    {
      $('#success').text(data.message);
      $('#txt' + data.ridx + data.cidx).css('background-color','#ffffff');
    }
    console.log('My Code');
    </script>
    <style>
      th{text-align:left}
    </style>
  </head>
  <body>
  <div id="success"></div>