【问题标题】:HTML list from data stored in Google Spreadsheet for Apps Script website/webapp - Templated HTML来自 Google 电子表格中存储的数据的 HTML 列表,用于 Apps 脚本网站/webapp - 模板化 HTML
【发布时间】:2016-07-03 17:10:01
【问题描述】:

我正在尝试制作的我的 Google Apps 脚本网络应用程序有一个按钮,用户可以单击该按钮并将其名称添加到其中。我正在尝试将这些信息保存为网站上的列表,这样如果我刷新页面,它仍然存在,并且如果其他人正在访问该网站,它仍然存在。

这是添加按钮 - https://snag.gy/EOgx5T.jpg
这些是从按钮添加的示例名称 - https://snag.gy/8GtX3Y.jpg

我不想将其保存为本地存储。有没有办法将信息保存到 Google 电子表格并将该电子表格用作数据库或其他东西?

索引.html
<div id="artistTabs">
   <ul id="artistList">
     <li><a onClick="addArtist(); return false;" href="">+</a></li>
  </ul>
</div>
js.html
function addArtist()
{
   console.log("add artist here");
   var artistName = prompt("enter artist whole first name and initial of last name");
    if (artistName === "") //user pressed 'ok' but input field was empty
    {
        return;
    }
    else if (artistName != "" && artistName !== null) //user inputs something and hits 'ok'
    {
         var ul = document.getElementById("artistList");
         var li = document.createElement("li");
         var a = document.createElement("a");
         a.setAttribute("href", "#");
         a.textContent = artistName;
         li.appendChild(a);
         ul.appendChild(li);   
         li.onclick = function()
         {
            test(); return false;
         };
   }
   else //user hits 'cancel' or 'x' 
   {
        return;
   }
}

function test()
{
    console.log("test");
}

我是否需要在 Google Apps 脚本“xxx.gs”或“xxx.js”文件中添加某些内容以保存信息/访问数据库/某些内容?

编辑

我更新了一些代码。我可以将艺术家写入电子表格,然后我可以从电子表格中取回艺术家姓名。我仍然对如何将列表中的新项目显示为模板化 html 感到困惑。

索引.html
<div id="artistTabs">
    <ul id="artistList">
        <li><a onClick="addArtist(); return false;" href="">+</a></li>
    </ul>
</div>
js.html
function addArtist()
{
  var artistName = prompt("enter artist whole first name and initial of last name");

  if (artistName === "") //user pressed 'ok' but input field was empty
  {
    return;
  }
  else if (artistName != "" && artistName !== null) //user inputs something and hits 'ok'
  {
    google.script.run
      .withSuccessHandler(writeSuccess(artistName))
      .withFailureHandler(writeFailure)
      .writeArtistName(artistName);
  }
  else //user hits 'cancel' or 'x'
  {
    return;
  }
}

function writeSuccess(artistName)
{
  console.log("write success: " + artistName);
}

function writeFailure()
{
  console.log("write failure - email myself why it failed and the time it failed");
} 
代码.gs
var ss = SpreadsheetApp.openById('id');
var sheet = ss.getSheets()[0];

function doGet()
{
  return HtmlService.createTemplateFromFile('index').evaluate();
}

function getContent(filename)
{
  return HtmlService.createHtmlOutputFromFile(filename).getContent();
}

function writeArtistName(artistName)
{
  var lastRow = sheet.getLastRow() + 1; //gets next unused row
  var column = 1; //first column
  var lastCell = sheet.getRange(lastRow, column);

  lastCell.setValue(artistName); //sets next blank row as artistName
}

function getArtistName()
{
  var lastRow = sheet.getLastRow(); //gets last row with content
  var column = 1;

  var lastArtist = sheet.getRange(lastRow, column).getValue(); //gets last row with artistName

  Logger.log(lastArtist);

  var x = '<li><a onClick="test(); return false;" href="#">';
  var y = lastArtist;
  var z = '</a></li>';

  var xyz = x + y + z;

  Logger.log(xyz);
}

如何调用code.gs文件中的getArtistName()函数,将艺术家姓名设置为我的无序列表中的列表项,并在网站上显示为html模板?我不能在 .gs 文件中调用 document.getElementById,因为它说的是 ReferenceError: "document" is not defined

即使我重新加载页面,我也需要将列表保留在网站上,并且任何人都可以从任何地方访问它

【问题讨论】:

  • 最好的选择可能是 PHP
  • @WilliamBrochmann 你能详细说明我将如何使用 php 吗?
  • 你可以用cookie之类的,我推荐你here
  • @nmnsud 它说“默认情况下,关闭浏览器时会删除 cookie”。我需要用户输入的信息永久保存在网站上,即使在页面刷新/关闭并再次打开之后也是如此。
  • 您可以轻松地将数据从您的 Apps Script Web App 保存到电子表格中。您将需要使用 google.script.run.myServerGS_function() 从 Web 应用程序与服务器代码进行交互。我假设您有一个 doGet() 函数将 HTML 提供给浏览器?并且您至少发布了一个版本? Link to Apps Script Documentation - google.script.run client side API

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


【解决方案1】:

您需要在服务器上构建 HTML。所以把你的 HTML 改成这样:

<div id="artistTabs">
   <ul id="artistList">
      <?!= createTheList(); ?>
  </ul>
</div>

服务器代码

function createTheList() {
  var artists,howManyRows,howManyColumns,i,L,newList,ss,sh,startingRow,startingColumn,
    thisArtist,templateHTML,thisRow;

  ss = SpreadsheetApp.openById('file ID goes here'); //Get spreadsheet
  sh = ss.getSheetByName('sheet tab name');

  startingRow = 2;
  startingColumn = 1;
  howManyRows = sh.getLastRow() - 1;
  howManyColumns = 1;

  artists = sh.getRange(startingRow,startingColumn,howManyRows,howManyColumns)
    .getValues();//Get all artist names
  L = artists.length; //How many artist in the list

  artists = artists.toString().split(",");//Flatten 2D array to 1D

  //template of blank row of HTML with a merge string of "z_z_z_z_z"
  templateHTML = "<li><a onClick="addArtist(); return false;" href="">z_z_z_z_z</a></li>";

  newList = "";//Initialize

  for (i=0;i<L;i+=1) {
    thisRow = "";//reset on every loop
    thisArtist = artists[i];

    thisRow = templateHTML.replace("z_z_z_z_z",thisArtist);//Inject artist name
    newList = newList + thisRow;//Keep adding to the list
  };

  return newList;
};

您可以将数据发送到 Google 电子表格。在您的情况下,收集的值的变量名称为artistName。因此,您可以像这样在 .gs 文件中调用 Apps 脚本函数:

GS 文件:

function writeToSpreadsheet(data) {
  var ss, sh;

  //Save data to a spreadsheet
  ss = SpreadsheetApp.openById('file ID goes here'); //Get spreadsheet
  sh = ss.getSheetByName('sheet tab name');
  sh.appendRow([data]);//Append data to end of sheet tab data
};

客户端代码:

<script>
  function someFunctionName(artistName) {//Either pass data to function
    //Or get the data
    var artistName = code to get the value;

    google.script.run
      .withSuccessHandler(serverCodeCompleted)
     .writeToSpreadsheet(artistName);
  };

  function serverCodeCompleted() {
    //Show message to the user
    some code here
  };
</script>

要让数据显示在您的页面中,您应该使用模板化的 HTML。

Apps Script documentation

【讨论】:

  • 我了解将信息写入电子表格部分。我不明白如何让这些信息在网站上永久保存,直到我想要它消失。模板化的 html 非常令人困惑……我是否在 html 文件中使用 '= ?>' 标记来执行 js 函数?如果是这样,我是否只需将整个 addArtist 函数放入其中?
  • 查看更新的答案。您还必须更改您的 doGet() 函数以添加:createTemplateFromFile('HTML file name').evaluate()
  • 它给了我'ReferenceError:“createTheList”没有定义。 '。服务器代码也用于“.js”文件吗?我不需要 html 和服务器代码的 gs 文件和客户端代码吗?
  • 桑迪,作为建议,OP 尚未进行任何研究或尝试将数据保存到工作表中。最好让用户研究并首先尝试,有很多资源或资源,包括在 SO 中解释任务的重复问题。毫不费力地给出答案会产生更多问题,因为操作通常还没有准备好回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多