我有一个Google表单,可以提交到Google电子表格。在电子表格方面,我有一个Google Apps脚本,可以加密提交的密码。但无论出于何种原因,它会将空字符串写入加密密码所在的位置。这真的开始强调我了。这是我的代码:
function encryptPassword(e) {
var password = e.values[6];
var split = password.split("");
password = "";
var char;
for(char in split) {
password = password.concat(getBinary(split[char]));
}
var spreadsheet = SpreadsheetApp.openById("1CywforbyBmPDHt2Uw9lJtyhqeklAAJp0IG7GfVV6U5U");
spreadsheet.getRange("G" + spreadsheet.getLastRow().toString()).setValue(password);
spreadsheet.getRange("H" + spreadsheet.getLastRow().toString()).setValue(password);
}
function getBinary(char) {
var binary = "";
var numValue;
var range;
var value;
var chars = [
["#", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P"],
["@", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"],
["&", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p"],
["%", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"],
["$", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
];
for(range in chars) {
for(value in range) {
if(value > 0) {
if(char == chars[range][value]) {
numValue = value - 1;
binary = binary + chars[range][0];
if(numValue / 8 >= 1) {
numValue = numValue - 8;
binary = binary.concat("1");
} else {
binary = binary.concat("0");
}
if(numValue / 4 >= 1) {
numValue = numValue - 4;
binary = binary.concat("1");
} else {
binary = binary.concat("0");
}
if(numValue / 2 >= 1) {
numValue = numValue - 2;
binary = binary.concat("1");
} else {
binary = binary.concat("0");
}
if(numValue / 1 >= 1) {
binary = binary.concat("1");
} else {
binary = binary.concat("0");
}
}
}
}
}
return binary;
}
只要表单提交到电子表格,encryptPassword(e)函数就会设置为运行。另请注意,我已修改了chars数组的内容,试图将加密保密。这应该没有区别,因为其余代码保持不变。
如何修复我的脚本,以便它实际上将加密的密码写入电子表格而不是空字符串?
答案 0 :(得分:1)
你有两个For / In循环:
for(range in chars) {
for(value in range) {
For / In循环用于循环访问对象的属性。当你使用它循环遍历数组时,就像你正在做的那样,"属性"是数组的索引号。
所以这一行:
for(range in chars) {
导致变量range
成为每个循环的数字值。在第一个循环中,range
的值为零。
第二个循环:
for(value in range) {
永远不会循环。没有什么可以循环的。变量range
的值只是一个数字。您无法遍历单个数字。如果你使用调试器,你可以看到每一行正在做什么,并一次执行一行代码。
如果要获取密码中某个字符的索引位置,可以使用indexOf()
。例如,如果密码中的字符是字母" i"。
var indexPosition = chars[2].indexOf(char);
indexPosition
的值为9.外部数组chars
中的第三个数组有一个元素" i"在第9个指数位置。