我已将脚本更改为以下内容:
function readRows(){
var nums = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten"];
function toText(num) {
var s;
if (num >= 100)
throw "Too big";
if (num > 10) {
if (num < 20) {
switch (num) {
case 11:
return "Eleven";
case 12:
return "Twelve";
case 13:
return "Thirteen";
case 14:
return "fourteen";
case 15:
return "Fifteen";
case 16:
return "sixteen";
case 17:
return "seventeen";
case 18:
return "eighteen";
case 19:
return "nineteen";
default:
return toText(num-10)+"teen";
}
}
switch (Math.floor(num / 10)) {
case 2:
s = "Twenty";
break;
case 3:
s = "Thirty";
break;
case 4:
s = "Fourty";
break;
case 5:
s = "Fifty";
break;
case 6:
s= "SiXty";
break;
case 7:
s = "Seventy";
break;
default:
s = toText(Math.floor(num/10))+"ty";
break;
}
if(num > 20 && num < 30)
{
return "twenty"+toText(num-20);
}
if(num > 30 && num < 40)
{
return "thirty"+toText(num-30);
}
if(num > 40 && num < 50)
{
return "fourty"+toText(num-40);
}
if(num > 50 && num < 60)
{
return "fifty"+toText(num-50);
}
if(num > 60 && num < 70)
{
return "sixTy"+toText(num-60);
}
if(num == 70)
{
return "sEvEnty";
}
if (num % 10 > 0)
return s + toText(num % 10);
return s;
}
return nums[num];
}
var sheet = SpreadsheetApp.getActiveSheet();
var lastCol = sheet.getLastColumn();
var length = sheet.getMaxColumns();
var rows = sheet.getMaxRows();
var Name = sheet.getRange(2, 2).getValue();
var data = sheet.getRange(2, 1, 2, lastCol);
var template = "spreadsheet key";
var fileName = "Application document template.docx";
var newFile = DocsList.getFileById(template).makeCopy(Name + " Application for Phase1 NF3").getId();
var doc = DocumentApp.openById(newFile);
var body = doc.getActiveSection();
for(var j=1; j<length; j++)
{
body.replaceText("Answer"+toText(j), data[0][j]); // line 105
}
}
在一个阶段我几乎工作,除了替换70,做了什么,然后没有任何工作。重做了,现在我收到了这个错误, TypeError:无法从undefined中读取属性“1.0”。 (第105行,文件“ConvertToDocs”)。 任何人都可以告诉我“1.0”属性可能指的是什么?为什么第一行代码没有显示在代码窗口中?
答案 0 :(得分:0)
我不知道有什么简单的方法,但这是一种蛮力的努力:
var nums = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten"];
function toText(num) {
var s;
if (num >= 100)
throw "Too big";
if (num > 10) {
if (num < 20) {
switch (num) {
case 11:
return "Eleven";
case 12:
return "Twelve";
case 13:
return "Thirteen";
case 15:
return "Fifteen";
case 18:
return "Eighteen";
default:
return toText(num-10)+"teen";
}
}
switch (Math.floor(num / 10)) {
case 2:
s = "Twenty";
break;
case 3:
s = "Thirty";
break;
case 5:
s = "Fifty";
break;
case 8:
s = "Eighty";
break;
default:
s = toText(Math.floor(num/10))+"ty";
break;
}
if (num % 10 > 0)
return s + toText(num % 10);
return s;
}
return nums[num];
}
function readRows() {
var sheet = SpreadsheetApp.getActiveSheet();
var lastCol = sheet.getLastColumn();
var length = sheet.getMaxColumns();
var rows = sheet.getMaxRows();
for(var i=2; i<rows; i++) // starting from row 2 in sheet
{
var Name = sheet.getRange(i, 2).getValue();
var data = sheet.getRange(i, 1, i, lastCol);
var template = <spreadsheet key goes here>;
var fileName = "Application document template.docx";
var newFile = DocsList.getFileById(template).makeCopy(Name + " Application for Phase1 NF3").getId();
var doc = DocumentApp.openById(newFile);
var body = doc.getActiveSection();
for(var j=1; j<length; j++)
{
body.replaceText("Answer"+toText(j), data[0][j]);
}
}
}
由于你的答案少于100,我最多只实现了99.我修改了你的代码,因为其中一些没有意义。
FWIW,内部for循环中的i
修改外部循环中的i
,因为变量是函数作用域,而不是块作用域。你好像不需要它所以我把它删除了。
答案 1 :(得分:0)
目前尚不清楚你的问题是什么 - 你在标题中有提示,但在文中提出不同的问题。让我们看看我们能做些什么。
首先 - 为什么错误?这很简单:data
被定义为Range
,但您尝试将其作为二维数组进行访问。您可能需要var data = sheet.getRange(...).getValues()
,它会为您提供范围内单元格的内容。
你在做那些奇怪的事情。您可以使用.getRange(2, 1, 2, lastCol)', which is
A2:x3`定义数据范围; 2行,x = maxColumns。然后,你尝试迭代一行和'maxColumns' - 有些东西不在那里,但只有你知道你想做什么。
第二次 - 你提到了循环。你有一个Array Iteration Bug:你正在循环这样 - for(var j=1; j<length; j++)
。问题是数组从0开始,所以你在访问data[][j]
时会跳过第一个元素。
第三次 - 您提到Document.replaceText()
。你没有说出你遇到了什么问题,但可能是因为你没有在文档中找到文本而没有进行替换。根据您的代码,以下是一些可能的解释:
"Answer"+toText(j)
,您可能需要"Answer "+toText(j)
。 最后,您不会问,但您发布的代码主要是什么 - 将数字转换为英文字符串表示。您可以而且应该简化toText()
功能。这类问题包含可用于简化解决方案的模式。你是那里的一部分 - 基本上,你有一组子数字只能用它们自己来表达(零,一,二......十九),另一组是复合物(二十[-blah] ],三十[-blah] ......)。因此,解决方案是将这两个组分开,并使用简单的数组来执行相应文本的查找。
function toText(num) {
if (num >= 100) throw new Error("Too big");
if (num < 0) throw new Error("Negative");
if (num - Math.floor(num) > 0) throw new Error("Not Integer");
var smallnums = ["Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten",
"Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","Seventeen","Eighteen","Nineteen"];
var tens = ["","","Twenty","Thirty","Fourty","Fifty","Sixty","Seventy","Eighty","Ninety"];
var s = "";
// Is this number in the smallnums set?
if (num < smallnums.length)
s = smallnums[num];
else {
// No, so express the 'tens', then (maybe) the 'ones'.
s += tens[Math.floor(num/10)];
var remnant = num % 10;
if (remnant > 0) s += "-" + smallnums[remnant].toLowerCase();
}
return s;
}