我有一个谷歌表单,当用户提交它时将触发我的功能运行,这将创建他们作为Google Doc提交的内容的摘要.我知道它可以自动发送电子邮件,但我需要格式化,以便我的用户以后可以编辑它.
表单上有一些复选框 - 但getResponse()仅填充了选中的项目,我需要它来显示所有可能的选项.然后我会以某种方式表明检查了什么.
我找不到一种方法来查看文本是否包含值.就像在带有String的Java中一样,我可以做任何一个.contains("9th")或者.indexOf("9th") >=0 然后我会知道String包含第9个.我怎么能用谷歌脚本做到这一点?通过文档查看,我觉得它一定是最简单的事情.
var grade = itemResponse.getResponse();
Run Code Online (Sandbox Code Playgroud)
需要看看成绩是否包含9.
谢谢!
在这背后(不是我承认......)有趣的问题是关于我使用的解决方法的真正问题,而没有真正理解它是如何工作的.
首先简要介绍一下我的用例,这一切都发生在侧边栏中显示的文档绑定UiApp中:
我必须在用GAS编写的邮件合并应用程序中通过电子邮件创建和发送几百个文档.当然,在没有达到5分钟执行时间限制的情况下,在一个批处理中花费太长时间,所以我尝试了一些不同的解决方法来完成任务:
它工作得很好,我处理40个文件批次是每次调用(大约3分钟)然后暂停一段时间并重新开始直到它完成.每个调用都由checkBox链接服务器处理程序触发,复选框本身在处理程序函数中更改,以这种方式创建自己的触发器.
我的问题(最后;-)是:知道整个过程可能需要30到60分钟,这可能有多精确? 这些服务器处理函数如何/为什么被视为多个进程,因为它们是从函数本身内部创建的?
我希望我足够清楚,(我怀疑,因为它在我的脑海里有点混乱:-)
我加入了时钟测试应用程序的代码,它给了我这个想法,它可能会让事情更容易理解.
function doGet() {
var app = UiApp.createApplication().setTitle('Counter/Timer');
var Panel = app.createAbsolutePanel().setStyleAttribute('padding','35');
var counter = app.createHTML().setId('counter').setHTML('<B>Timer = wait</B>').setStyleAttribute('fontSize','40px');// set start display
var clo = app.createTextBox().setName('clo').setId('clo').setValue('0').setVisible(false);//set start value in seconds
var handler1 = app.createServerHandler('doSomething').addCallbackElement(Panel);
var chk1 = app.createCheckBox('test1').addValueChangeHandler(handler1).setVisible(true).setId('chk1').setVisible(false);
app.add(Panel.add(chk1).add(counter).add(clo));
chk1.setValue(true,true);// start the process
return app}
function doSomething(e) {
var app = UiApp.getActiveApplication();
var xx = Number(e.parameter.clo);
var disp = app.getElementById('counter')
xx++ ;// replace by xx-- to count downwards
if(xx>600){ // …Run Code Online (Sandbox Code Playgroud) 我必须从存储在电子表格中的用户数据列表中生成标签.现在我得到的一切都很好,除了当我输出超过16个项目(每页的标签数量)时,我有多个文档,每个文档都是一个页面.每个文档都有一个独特的名称,因此使用起来并不是很难,但打开这么多文档打印它们真是太无聊了.由于我不想创建500个项目(或任何数字)的模板,我想知道我是否可以在多页文档中重复这个单页模板,所以我将所有标签都放在一个文档中.打印会更舒服;-)到目前为止我找不到任何线索......任何好主意?这是我用来生成文档的代码(有点长,抱歉):
并且...非常感谢任何帮助.
function print(e){
var app = UiApp.getActiveApplication();
var selrangerow = sh.getActiveSelection().getRowIndex();
var selrangeheight = sh.getActiveSelection().getNumRows();
var selrangeend = selrangerow+selrangeheight-1
var selrange = sh.getRange(selrangerow,1,selrangeheight,7).getValues();
var feuilles = Math.ceil(selrangeheight/16);
for (ff=1;ff<=feuilles*16;++ff){
if(ff>selrange.length){selrange.push([" "," "," "," "," "," "," "])} ;// remplit selrange jusqu'à multiple de 16 (nbre de feuille)
}
//Logger.log(selrange)
//Logger.log(e.parameter.mode) ;// gauche=true, centre = false
if(e.parameter.mode=='false'){
var doctemplate = DocsList.getFileById(labeltemplatedoc);// false >> centre
}else{
var doctemplate = DocsList.getFileById(labeltemplatedocleft);// true >> gauche
}
//Logger.log("File name: " + doctemplate.getName());
var FUS1=new …Run Code Online (Sandbox Code Playgroud) 自从引入新的电子表格版本以来,可以手动更改单个单元格(或合并单元格)内的文本属性,如下例所示:
(左=原始文本,右=格式化文本,更易于阅读)
我没有看到通过脚本实现这一点的任何方法......我也没有在问题跟踪器中看到任何问题或功能请求.
那可能吗 ?
我尝试获取文本属性的每个方法只返回一个值,所以我担心我不能这样做......但谁知道呢?
编辑(最后!:-):解决方法是将整个UI放在absolutePanel(thx兆字节1024)中.它并不完美,因为我不能在整个显示区域中拥有背景色,但它至少更加舒适.(链接到在线测试应用程序更新了这个新版本)和最终版本的屏幕截图...更好:-)

我有一个用GAS编写的独立webapp,它有一个scrollPanel,整个UI很小,只占用浏览器窗口中一个(甚至很小的)显示区域的一部分.
困扰我的是,我在浏览器窗口中始终同时具有水平和垂直滚动条,当我使用鼠标或触控板在UI窗口中滚动滚动面板时,它会干扰UI内容...所以,我的问题是:有没有办法避免这种情况,告诉浏览器不需要添加滚动条或定义更小的"webapp区域"?
请注意,只要最后一个滚动条小于浏览器窗口,这些滚动条的大小就完全独立于UI面板大小.
下面是一个屏幕截图来说明我在说什么(我不明白,这是一个细节,但它使得使用这个应用程序的有时只是不舒服;-)这里也是一个链接公版的应用程序.
我想要解决的另一个细节是这个UI上半部分的字体颜色:这些是我设置为"只读"的文本框,因为我不希望它们是可编辑的(这会给用户带来错觉)可以修改不属于这种情况的数据)这种只读状态的副作用是字体是"灰色的"...是否有一些方法可以避免这种情况,同时在这个'假表'上保持相同的方面(颜色除外) ?
编辑:找到关于文字颜色的第二个问题:.setStyleAttribute('color','#000000')就像那个一样简单......我太傻了没有早点找到它;-)
注2 :有趣的是,使用GUI构建器设计的UI不会遇到同样的问题......
EDIT2:这是doGet部分的代码(修改后运行时没有功能但要显示):
var key='0AnqSFd3iikE3dFV3ZlF5enZIV0JQQ0c1a3dWX1dQbGc'
var ss = SpreadsheetApp.openById(key)
var sh = ss.getSheetByName('Sheet1')
var idx = 0
var data = ss.getDataRange().getValues();
var len = data.length;
var scrit = ['All fields','Name','Lastname','Postal Adress','ZIP code','City','Country','email','phone#']
//public version
function doGet() {
var app = UiApp.createApplication().setTitle("BrowseList Test")
.setHeight(420).setWidth(800).setStyleAttribute("background-color","beige").setStyleAttribute('padding','20');
var title = app.createHTML('<B>DATABASE User Interface</B>').setStyleAttribute('color','#888888');
app.add(title);
var scroll = app.createScrollPanel().setPixelSize(750,150)
var vpanel = app.createVerticalPanel();
var cell = new Array();
var cellWidth …Run Code Online (Sandbox Code Playgroud) 我试图将数组的内容从一张工作表(其中数组是通过迭代并推送用户选择的列的选择项目来创建的)复制到不同电子表格中的另一张工作表。
我遇到了许多关于如何将一个范围从一个电子表格导入到另一个电子表格的问题和答案,但没有一个对我有用(所有问题和答案都返回错误“我们很抱歉,发生了服务器错误。请稍等一下”然后再试一次。”)我也尝试过“copyTo”,但没有成功。
这是我当前正在使用的代码。我哪里出错了??
function copyToTrix(featureList) {
featureList = featureList.getValues();
var tss = SpreadsheetApp.openById("0AtX9IYFZ..."); //define active trix as target
var ts = tss.getSheetByName("US"); //define sheet in target trix
var newRange = ts.getRange("DA12:DA25"); //define target range
newRange.setValues(featureList); //set values in target range to items in featureList
Browser.msgBox('copied');
}
Run Code Online (Sandbox Code Playgroud) 我正在使用谷歌应用程序脚本来构建自定义电子表格.为了提高脚本的渲染速度,我首先构建一个输出值数组,然后使用setValues()它一次构建电子表格.
当我尝试将公式添加到电子表格中时,setFormulas()它也会覆盖我的所有值.所以现在我有一个案例setValues()覆盖我的公式并setFormulas()覆盖我的价值观.
有没有办法可以为输出数组中的特定元素指定掩蔽值,以便这些元素不会覆盖电子表格中已有的数据?
理想情况下,我会将输出数组的每个元素初始化为此屏蔽值,然后只有非屏蔽元素才会显示在电子表格中.
在Google 参考文档中,我找到了一个简短的函数,可以将 RFC3339 日期字符串转换为有效的 Date 对象。代码非常简单,如下所示:
function parseDate(string) {
var parts = string.split('T');
parts[0] = parts[0].replace(/-/g, '/');
return new Date(parts.join(' '));
}
Run Code Online (Sandbox Code Playgroud)
问题是它不起作用。(我很惊讶他们发布了一个不起作用的代码......我错过了什么吗?)
我在使用 JSON 字符串化和解析日期时也遇到了问题,因为 JSON 方法返回 UTC 值(末尾有 Z),因此我丢失了时区信息。谷歌的代码也不能处理这个问题(即使它有效)。
下面是我用来测试它的演示代码以及我为获得我想要的东西而编写的解决方案。不确定它是否非常高效或写得很好,但至少我得到了我想要的结果(我在设置为 GMT+2(比利时夏季时间)的脚本中执行此代码)。我愿意接受任何改进此代码的建议。(这将是这个问题的主题)
我在代码中添加了很多日志和注释,以使其尽可能清晰:
function testJSONDate() {
Logger.log('starting value : "2016/3/31 12:00:00"');
var jsDate = JSON.stringify(new Date("2016/3/31 12:00:00"));// time is 12:00 I'm in GMT+2
Logger.log('JSON.stringify value : '+jsDate);
Logger.log('JSON parse jsDate : '+JSON.parse(jsDate)); // time is 10:00, UTC
var jsDateWithoutQuotes = jsDate.replace(/"/,'');
var date = parseDate(jsDateWithoutQuotes);
Logger.log('parsed RFC3339 …Run Code Online (Sandbox Code Playgroud) 当我想也许有一种方法可以使用array.sort()来完成这项工作时,我开始为此编写一个冒泡排序?
这是一个(希望)明确我要排序的例子:(文件名列表)
var array = ['impression_page_1_12_juin','impression_page_1_13_juin','impression_page_2_12_juin','impression_page_2_13_juin']
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,在2个不同日期有2个'page1',每个字符串中只有字符19和20不同.我想对这2个字符进行排序.
Javascript可以直截了当地执行,还是应该返回到我的子串和冒泡排序方法?
在我正在处理的mailMerge脚本中,我用它.replaceText()来替换数据库中相应值的字段.
界面允许在文档中测试以查看结果是否按预期显示,并且我需要有一个'UNDO'函数来将我的字段放在原始位置,以便我可以将其与其他值一起使用.(此脚本有界到侧栏中的文档,请参阅此帖子以进行说明)
下面的脚本通过在内存中保留字段名称作为替换值来做得非常好.困扰我的唯一细节是我必须为当前测试数据中没有值的字段定义一个特殊的"空"标签,以防止在文档中丢失它们的轨道.(我使用了编号标识符,如°vide12°).
这是完美的工作,但它并不理想,因为测试模式下的文档并不完全代表最终文档,因为我使用了这些°videXX°...
问题是:当没有数据以不太明显的方式显示时,是否有人有更好的想法或其他方法来"本地化"替换数据?(我知道这听起来很奇怪......这就是我解释整个情况的原因:-)
考虑到Google Docs的构建方式,我认为我可以获得完整的元素结构并从该信息重建文档,但我担心这是不可能的,因为最小的元素是一个段落,而字段主要只是单个单词. ..
这是我使用的代码的相关部分,我添加了一些注释以使其(希望)清楚.
function valuesInDoc(e){ // this function replaces the fields with database values
var app = UiApp.getActiveApplication();
var listVal = UserProperties.getProperty('listSel').split(',');
var replacements = [];
var doc = DocumentApp.getActiveDocument();
var body = doc.getBody();
var find = body.findText('#ch');
if(find == null){var ui = DocumentApp.getUi() ; ui.alert("Aucun champ (#chX#) trouvé dans le document... Veuillez insérer des identifiants aux endroits souhaités");return app};
var curData = UserProperties.getProperty('selItem').split('|');
var Headers = [];
var OriHeaders …Run Code Online (Sandbox Code Playgroud)