Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用google工作表脚本编辑器将数据提交到不同的选项卡_Javascript_Google Apps Script_Google Sheets_Google Apps - Fatal编程技术网

Javascript 使用google工作表脚本编辑器将数据提交到不同的选项卡

Javascript 使用google工作表脚本编辑器将数据提交到不同的选项卡,javascript,google-apps-script,google-sheets,google-apps,Javascript,Google Apps Script,Google Sheets,Google Apps,在我的电子表格脚本编辑器中,我有以下代码: 代码.gs function doGet() { return HtmlService.createTemplateFromFile('checkForm.html') } function doPost1(e) { Logger.log(JSON.stringify(e)) if (!e || !e.parameter) { return; } var lock = LockService.getScriptLoc

在我的电子表格脚本编辑器中,我有以下代码:

代码.gs

function doGet() {
    return HtmlService.createTemplateFromFile('checkForm.html')
}

function doPost1(e) {

  Logger.log(JSON.stringify(e))
  if (!e || !e.parameter) {
    return;
  }
  var lock = LockService.getScriptLock();
  lock.tryLock(10 * 1000);
  var scriptProp = PropertiesService.getScriptProperties();

  try {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var checkForm = ss.getSheetByName("checkForm");
    var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
    var nextRow = sheet.getLastRow() + 1;
    var newRow = headers.map(function(header) {
      return header === 'Timestamp' ? new Date() : e.parameter[header]
    });
    sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow]);

    var startTime = newRow[1];
    var endTime = newRow[2];
    var cal = CalendarApp.getCalendarById("ID");
    var allEvents = cal.getEvents(new Date(startTime), new Date(endTime));
    if (allEvents.length > 0) {
    return HtmlService.createTemplateFromFile('calendarAgenda.html')
    }else {
    return HtmlService.createTemplateFromFile('bookingForm.html')
    };

  }

  catch (e) {
    return ContentService
      .createTextOutput(JSON.stringify({ 'result': 'error', 'error': e }))
      .setMimeType(ContentService.MimeType.JSON)
  }

  finally {
    lock.releaseLock()
  }
}

function doPost2(e) {

  Logger.log(JSON.stringify(e))
  if (!e || !e.parameter) {
    return;
  }
  var lock = LockService.getScriptLock();
  lock.tryLock(10 * 1000);
  var scriptProp = PropertiesService.getScriptProperties();

  try {
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var bookForm = ss.getSheetByName("bookForm");
    var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
    var nextRow = sheet.getLastRow() + 1;
    var newRow = headers.map(function(header) {
      return header === 'Timestamp' ? new Date() : e.parameter[header]
    });
    sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow]);    

    return ContentService
    .createTextOutput(JSON.stringify('Successfully received. Thank you!'))
      .setMimeType(ContentService.MimeType.JSON)
  }

  catch (e) {
    return ContentService
      .createTextOutput(JSON.stringify({ 'result': 'error', 'error': e }))
      .setMimeType(ContentService.MimeType.JSON)
  }

  finally {
    lock.releaseLock()
  }
}

checkForm.html

<!DOCTYPE html>
<body>
<form name="class1Check" id="class1Check" action="ScriptURL" target="_self" method="POST">
Start Date & Time
<input class="w3-input w3-border" type="datetime-local" required name="Start Date & Time">
<br><br>
End Date & Time
<input class="w3-input w3-border" type="datetime-local" required name="End Date & Time">
<button type="submit" onclick="google.script.run.doPost1(this.parentNode)">Check</button>
</form>
<script>
function postData(form) {
  google.script.run.withSuccessHandler(postData).doPost1(e);
}
</script>
</body>
</html>

开始日期和时间


结束日期和时间 检查 函数postData(表单){ google.script.run.withSuccessHandler(postData.doPost1(e); }
bookingForm.html

<!DOCTYPE html>
<body>
<form name="class1Booking" id="class1Booking" action="ScriptURL" target="_self" method="POST">
<inputs> ..
<button type="submit" onclick="google.script.run.doPost1(this.parentNode)">Check</button>
</form>
<script>
function postData(form) {
  google.script.run.withSuccessHandler(postData).doPost2(e);
}
</script>
</body>
</html>

..
检查
函数postData(表单){
google.script.run.withSuccessHandler(postData.doPost2(e);
}
goGet函数返回“checkForm.html”页面,提交时该页面应运行doPost1函数将数据发送到电子表格中的“checkForm”选项卡,然后返回第二个页面“bookingForm.html”,提交时该页面应运行doPost2函数将数据发送到“bookForm”选项卡然后返回某个文本输出

当我提交检查表单时,我收到错误“Script function not found:doPost”,我想我可能对google.Script.run有一些问题,我尝试过多次修改,但都没有成功。任何提前的帮助和感谢

忘记doPost()。试试这样的

HTML:

就我个人而言,我更喜欢将所有javascript和css放在同一个文件中,因为以后更容易找到。是的,我知道它可能变大,但这是我的选择,不必由您选择。

您没有正确使用函数,正如中所述,您只能返回类型的值:

数字、布尔值、字符串或null,以及JavaScript对象和 由基本体、对象和数组组成的数组

在您的情况下,您试图返回一个对象,这是不允许的,此类用于函数(doGet(e)或doPost(e))

在关于[客户端到服务器通信]()的文档中,解释了如何使用google.script.run。以下是一个应用于您的案例的示例,以便您更好地了解其工作原理:

checkForm.html

<!DOCTYPE html>
<body>
<form name="class1Check" id="class1Check" target="_self" method="POST">
Start Date & Time
<input class="w3-input w3-border" type="datetime-local" required name="Start Date & Time">
<br><br>
End Date & Time
<input class="w3-input w3-border" type="datetime-local" required name="End Date & Time">
<button onclick="postData(this.parentNode)">Check</button>
</form>
<script>
//It’s run when form button is clicked 
function postData(form) {
   //Calls doSomething function in code.gs with form parameter
  google.script.run.withSuccessHandler(handlerFunction).doSomething(form);
}

//Handles the response from doSomething function
function handlerFunction(responseData) {
  //Logs ‘It worked!’ in developer console
  console.log(responseData);
}
</script>
</body>
</html>
Apps Script的Web应用程序被设计为单页应用程序(一个HTML页面),而不是多页应用程序,尽管有不同的解决方案示例可以指导您实现多页行为:

[1]


[2]

我认为重命名以执行类似的post功能根本不起作用,但我从未尝试过,所以我真的不知道这一点。那么,您建议如何实现类似的功能?您的do post客户端中的e参数有什么意义?我不认为doposts应该与google.script.run一起使用。我会在我的计算机上与您联系。在不同的情况下,当我只处理一个表单时,我不会使用google.script.run。仅将脚本URL放在表单操作中,doPost将数据发送到工作表。现在我有两个不同形式的post案例,我需要脚本来区分它们。当我搜索它时,我想我可以使用google.script.run来运行两个doPost函数(每个表单一个),这是基于函数名的更改{在HTML文件中,我在客户端放了一个C,在服务器端放了一个S。很多时候我只是让它们相同。在这种情况下,函数可以有相同的名称,因为一个在服务器上,一个在客户端javascript。我试图使用你的解决方案,但仍然没有找到答案。我应该有两种形式,但在你的HTML只存在一个。很抱歉,我不太擅长编码,而且事情对我来说似乎很难。我并没有试图提供一个完整的解决方案。我只是想向您展示一种技术,它可以为您工作,因为很明显,您的工作方式是行不通的。那么这两个表单是在同一页上还是在不同的页上?
function processFormS(obj) {
  //obj.name1...
  return {msg:'Got it.'}
}

function doGet() {
    return HtmlService.createHtmlOutputFromFile('whatever file name')
}
<!DOCTYPE html>
<body>
<form name="class1Check" id="class1Check" target="_self" method="POST">
Start Date & Time
<input class="w3-input w3-border" type="datetime-local" required name="Start Date & Time">
<br><br>
End Date & Time
<input class="w3-input w3-border" type="datetime-local" required name="End Date & Time">
<button onclick="postData(this.parentNode)">Check</button>
</form>
<script>
//It’s run when form button is clicked 
function postData(form) {
   //Calls doSomething function in code.gs with form parameter
  google.script.run.withSuccessHandler(handlerFunction).doSomething(form);
}

//Handles the response from doSomething function
function handlerFunction(responseData) {
  //Logs ‘It worked!’ in developer console
  console.log(responseData);
}
</script>
</body>
</html>
//Web App function
function doGet() {
    return HtmlService.createTemplateFromFile('checkForm.html')
}

//Apps script function to receive form object and return response
function doSomething(form) {
//Do something
  return ‘It worked!’;
}