- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 Google Apps 脚本发送电子邮件 - 我知道该怎么做。我想嵌入“是或否”回复链接或多项选择题,并将收件人的回复记录在 Google 电子表格中。
我该怎么做?
最佳答案
此工作流中涉及的组件是:
doPost()
函数来处理响应。脚本必须是 deployed as a Web App .下面是此类工作流程的一个示例,进行通勤调查。收件人将收到这样的调查电子邮件:
如果电子邮件客户端支持该功能,收件人可以直接在其电子邮件客户端中填写表格。回复将收集在电子表格中,如下所示:
在运行脚本之前自行创建电子表格标题。
已添加“序列号”列以说明将响应与特定受访者相关联的方法;请注意,有些条目会重复。当生成调查电子邮件时,它会获得一个唯一的序列号,然后作为隐藏值与回复一起传回。例如,我们可以扩展该系统以识别来自受访者的更新。
现在,代码。 (这也是 available as a gist 。)
<div>
<form action="<?= scriptUrl ?>" method="Post">
<table>
<tr>
<td>
<label for="commute">Do you commute to work?</label>
</td>
<td>
<select name="commute">
<option>Yes</option>
<option>No</option>
</select>
</td>
</tr>
<tr>
<td>
<label for="vehicle">If "Yes", how do you get to work?</label>
</td>
<td>
<input type="checkbox" name="vehicle" value="Bike">I have a bike<br>
<input type="checkbox" name="vehicle" value="Car">I have a car
</td>
</tr>
<tr>
<td>
<!-- A Hidden field is a handy way to pass information to the
Server-side POST handler. For example, a serial number could
be used to collate responses from a particular recipient. -->
<input type="hidden" name="serial" value="<?= serialNumber ?>" />
</td>
<td>
<input type="submit" value="Submit" />
</td>
</tr>
</table>
</form>
</div>
// doPost needs the spreadsheet ID, it has no concept of "active spreadsheet".
var _spreadsheetId = '--- Spreadsheet ID ---';
// Add custom menu with option to send survey
function onOpen() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var entries = [{
name : "Send Survey",
functionName : "sendSurvey"
}];
sheet.addMenu("Custom Menu", entries);
};
/**
* Build & Send Survey, an HTML form in email.
*/
function sendSurvey() {
var recipient = Browser.inputBox("Send Survey", "Enter Recipient Email", Browser.Buttons.OK_CANCEL);
if (recipient === 'cancel') return;
var subject = 'Commuting Survey';
// Get the URL of the published Web App, to include in email for POST of response
var scriptUrl = ScriptApp.getService().getUrl();
if (!scriptUrl) throw new Error( 'You must Deploy as Web App first.' );
// Build email body
var template = HtmlService.createTemplateFromFile('emailTemplate');
template.scriptUrl = scriptUrl;
template.serialNumber = getGUID(); // Generate serial number for this response
var html = template.evaluate().getContent();
// During debugging, send emails to self. Remove this line for real operation.
recipient = Session.getActiveUser().getEmail();
// Send email form
GmailApp.sendEmail(recipient, subject, 'Requires HTML', {htmlBody:html} );
Browser.msgBox("Survey Sent");
}
/**
* POST handler for responses;
*/
function doPost(e) {
Logger.log(e);
var ss = SpreadsheetApp.openById(_spreadsheetId);
var sheet = ss.getSheets()[0]; // Assume first sheet collects responses
// Build a row of data with timestamp + posted response
var row = [
new Date(), // Timestamp
e.parameters.serial[0], // Serial Number
e.parameters.commute[0], // Commuter? Yes / No
e.parameters.vehicle.join(',') // Vehicle
];
// Make sure we are the only people adding rows to the spreadsheet
var lock = LockService.getPublicLock();
// Wait for up to 30 seconds for other processes to finish.
var locked = lock.tryLock(30000);
if (locked) {
// Save response to spreadsheet
var rowNum = sheet.getLastRow()+1;
sheet.getRange(rowNum, 1, 1, row.length).setValues([row]);
// Release the lock so that other processes can continue.
lock.releaseLock();
var result = "Response Recorded: \n "+row.join('\n ');
}
else {
// Failed to get lock
result = "System busy, please try again.";
}
// Report result of POST, in plain text
return ContentService.createTextOutput(result)
.setMimeType(ContentService.MimeType.TEXT);
}
/**
* Returns an rfc4122 version 4 compliant GUID / UUID string
* Thanks to @broofa!
* http://stackoverflow.com/a/2117523/1677912
*/
function getGUID() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
return v.toString(16);
});
}
按原样使用此调查系统:
Code.gs
内容。复制电子表格的 ID,并更新文件顶部的 _spreadsheetId
变量。保存。emailTemplate.html
内容。保存。onOpen
函数来授权脚本。准备出发!您会在电子表格中找到一个“自定义菜单”,其中包含“发送调查”命令。
关于html - 通过电子邮件发送表单并在电子表格中跟踪回复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18668828/
我这里有一个工作示例。 https://developers.google.com/google-apps/spreadsheets/我需要从用户的谷歌文档下载一些文件。 import com.goo
我需要您在以下方面的帮助: 假设我们有 3 个不同的组:(A、B、C) 我们在每个组中有几个值范围: (Eg. A has 0 - 100, 101 - 200 while B has 0 - 200
谁能告诉我有什么方法可以从 python 连接到电子表格吗?我想从表单中存储一些数据并将其提交到谷歌电子表格。请帮助解决这个问题。我必须遵循哪些步骤? 提前致谢... 最佳答案 连接到 Google
我正在尝试计算 2019 年给定时间范围内的月数。 我的数据如下所示: 我将开始日期和结束日期列的格式更改为“日期”。 “以月为单位的持续时间”和输出列具有数字格式。 我接近它如下: 如果开始日期(年
在设计上有一点问题,希望我能在这里寻求建议。接受 grails 可能是完全错误的工具,但这就是生活。 所以一直在努力开发一个网络应用程序,该应用程序基本上只是从谷歌电子表格中呈现大量信息并发回一些更新
我正在设计一个胖客户端(即非浏览器)Python 应用程序,它将与托管数据库进行通信。该应用程序的屏幕之一需要有一个网格/电子表格区域,允许显示多行数据、过滤、排序和更新多行信息。有人推荐一个具有此功
我在 Django 中有一个表单,可以将用户添加到 mySQL 数据库。然而,用户将不得不添加大量用户,并且一些信息将被复制和粘贴。所以我在想是否有一种方法可以有一个类似表单的电子表格,其中列标题是将
我在 Outlook VBA 中编写了一个程序,它根据 Excel 电子表格的内容创建一些电子邮件。一切正常,但是当程序终止时,我继续运行“EXCEL.EXE”进程,该进程会锁定电子表格,因此其他人无
如何使用公式来确定当前时区? 我使用的公式给出了意想不到的结果。 我的电子表格设置(文件 > 电子表格设置...): 时区: (GMT+01:00) 阿姆斯特丹 我使用的公式: =TEXT(NOW()
如何转换持续时间的小时数? 示例:在单元格 A1 中,我有 176 . 我希望单元格 A2 有 176:00:00 我想在 176 小时(持续时间)内转换数字 176。那可能吗?因为如果我在单元格中键
我收到了 4 个不同的采购订单,上面有一个随机的采购订单编号。 我仅在 A 列中填写采购订单号。 对于这个例子,我收到了下面列出的 4 个不同的采购订单。 采购订单 697533 - 2 项 采购订单
我需要编写循环遍历数据列的程序。根据单元格值和代表变量的每一列重置变量。 练习中的变量取决于循环的这些值。 如何在循环的每次迭代中将值增加 1 来循环遍历行? df=pd.DataFrame(r'C:
我正在做一些详尽的搜索,需要确定新域 (URL) 是否已经在电子表格中。但是,没有一个电子表格对象具有搜索功能,即在大多数文档对象中找到的 findText()。我觉得我错过了一些重要的东西。 我错过
我正在尝试在 Pandas 中导入一个 excel 电子表格,但由于数据“由用户在视觉上构建”以在视觉上对用户友好并且没有使用正确的数据结构,因此我遇到了一些问题。 结果,当在 Pandas 中作为数
我必须在 HTML 页面上显示多个图表,但我无法进行多个查询(直接在 google 电子表格上)。 实际上,我只是第一个查询显示的是谁。 我的代码: Page de pilotage
我使用以下代码作为将 html 网站上的用户输入数据发送到 Google 电子表格的方法: Javascript: function postContactToGoogle() { v
我有一个使用 Google Drive 和电子表格 API 的网站。我想要做的是,如果没有找到具有特定条件的电子表格,则在用户的 Google 云端硬盘上创建电子表格。该电子表格应该是我的 Googl
我目前链接到六个 Excel 电子表格,主要是因为用户在 Excel 中编辑数据更容易/更好(他们从未使用过 Access),而且任何更改都会立即反射(reflect),包括是否有新列添加后即可立即供
我正在努力通过 PowerShell 添加指向可变长度电子表格的链接,无论如何我都会遇到错误。这是我目前正在尝试制作的循环,它嵌套在一个 excel comobject 中, $sheet 代表 $e
在 Excel 电子表格中编写许多工作表可能需要一段时间。并行化它会很有帮助。 此代码运行良好,它使一个 Excel 电子表格在屏幕上弹出,其中包含四个名为 Sheet1、1、2 的工作表 和 3。
我是一名优秀的程序员,十分优秀!