Я понял ваш вопрос, как указано выше. Как насчет этого примера сценария? Процесс этого примера сценария выглядит следующим образом.
При использовании этого примера сценария выполните следующую последовательность действий.
openFile()
. Sheet1
из var sheet = "Sheet1"
. В этом примере предполагается, что раскрывающийся список помещен в «Лист1». A1
из var range = "A1"
. В этом примере предполагается, что раскрывающийся список помещается в ячейку «A1». Сценарий:
function openFile(e) {
var sheet = "Sheet1"; // Please set the sheet with the dropdown list.
var range = "A1"; // Please set the range of dropdown list.
if (e.source.getSheetName() == sheet && e.range.getA1Notation() == range) {
var file = DriveApp.getFilesByName(e.value);
if (file.hasNext()) {
var f = file.next();
var url = f.getUrl();
var script = "";
var html = HtmlService.createHtmlOutput(script);
SpreadsheetApp.getUi().showModalDialog(html, 'Open ' + f.getName());
}
}
}
Причиной проблемы является function onEdit(e) {openFile()}
. e
из onEdit(e)
не дано в openFile()
. При этом возникает такая ошибка. Поэтому, пожалуйста, установите триггер OnEdit для функции openFile()
. Поэтому, пожалуйста, сделайте следующее.
onEdit()
. openFile()
как триггер OnEdit. openFile()
автоматически запускается установленным триггером. В это время дается объект события. Генерируйте пару "открытый/закрытый ключ" для подписания. Снабдите цифровой подписью комбинацию идентификатора пользователя и значения купона с помощью закрытого ключа. Опубликуйте значение купона + подпись как код купона, закодированный, например, с помощью букв и чисел. Клиентское приложение проверило бы код путем воссоздания комбинации данных, которые были первоначально подписаны (например, предварительно ожидайте идентификатор пользователя к значению купона), и затем проверка цифровой подписи.
Походит на случай для асимметричного шифрования. Вы могли выделить открытый ключ всем, таким образом предоставив им информацию для проверки купона, но способность создать cupon будет лежать на владельце закрытого ключа (= Вы).
Я создал бы класс купона, который сериализирует к xml, и затем зашифруйте строку xml. Проверка должна была бы дешифровать строку и видеть, является ли это допустимый xml (я рекомендую не десериализовать объект, не проверяя это прежде).
Я использовал бы клиентский код и дату истечения срока купона. Что касается проверки, Вы могли просто сохранить допустимые купоны в своей базе данных и проверить от этого. Вы могли просканировать таблицу купона один раз в день для чистки истекших кодов.
Насколько умный Ваши продавцы (или женщины)? Вы могли просто базироваться 64, кодируют значение?
Проверьте здесь на то, как к base64 закодируйте и декодируйте:
http://arcanecode.wordpress.com/2007/03/21/encoding-strings-to-base64-in-c/
Кроме этого я зашифровал бы значение с ключом, известным Вами и клиентским приложением.
Это должно только подвести итог ответов до сих пор. Существует два основных отличных способа генерировать такие коды купона:
Централизованное решение: информация о каждом купоне хранится в Вашей базе данных. Код купона может затем быть случайным образом сгенерирован и короткий - это - просто ссылка на запись в Вашей базе данных, которая содержит всю необходимую информацию, такую как значение купона, идентификатор клиента, идентификатор представителя. Проверка такого кода требует онлайн-доступа к Вашим серверам.
Децентрализованное решение: купон является автономной информацией, которая может быть проверена в режиме офлайн, не получая доступ ни к одному из Ваших серверов. В результате код купона должен содержать некоторых (или даже все) информации. Самый безопасный путь состоит в том, чтобы использовать криптографию с асимметричными шифрами или Код аутентификации сообщений так, чтобы никто кроме держателя закрытого ключа можно было генерировать купоны.
Я предполагаю от способа, которым Вы формулировали вопрос, Вы не хотите хранить коды в базе данных (если бы Вы сделали, то Вы могли бы просто проверить каждый код против базы данных),
Так, что Вы могли сделать, сопровождают всю уместную информацию, что находится в купоне, затем хешируйте его вместе с секретной солью для предотвращения вмешательства.
Таким образом предположите желание купона для пользователя 23 стоимостью в 200$ Вы могли бы создать строку как "23_200" и вычислить хеш MD5 с секретной солью "BillTheLizard" для получения 2671519131e974ee6fc746151e98f4a8, таким образом полный код, который Вы даете клиенту, 200_23_2671519131e974ee6fc746151e98f4a8
Теперь при получении кода Вы разбиваете его и проверяете что md5 ("200_23" +secret) = 2671519131e974ee6fc746151e98f4a8 для проверки значения
Править: Если бы 32 символьных хеша являются слишком длинными, Вы могли бы всегда усекать их, например, срубание их к 8 символам все еще дало бы Вам 4294967296 различных значений хэш-функции.
Стив Гибсон говорит об одноразовых паролях на своем веб-сайте, но нет никаких причин, по которым вы не могли использовать его для создания одноразовых кодов купонов: http://grc.com/ ppp