【发布时间】:2019-02-18 23:45:15
【问题描述】:
此功能独立工作,可将一行数据移动到不同的工作表。我意识到我需要将该行数据捕获到一个变量中,以便我可以在另一个函数中处理它。但是我已经考虑并尝试了各种想法来使用已经定义的变量来捕获行,但是几周过去了,没有任何进展。
function onEdit(e){
var ss = SpreadsheetApp.getActive();
var s = ss.getActiveSheet();
var r = ss.getActiveRange();
var row = r.getRow();
var column = r.getColumn();
//moving from the Form Responses 1 sheet to the Processed sheet
if(s.getName() == "Form Responses 1" && r.getColumn() == 1 && r.getValue() == true) {
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Processed");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).copyTo(target);
s.deleteRow(row);
}
var ProOrd = HtmlService.createHtmlOutput(target);
SpreadsheetApp.getUi().showModelessDialog(ProOrd, 'Details have been archived to the Processed sheet')
}
有人可以展示如何将该行放入一个用于按摩的变量中,而不仅仅是将其移动到另一张纸上吗?
我想获取该“目标”数据并将其推送到对话框中。最终用户会将信息放入另一个软件并关闭此对话框。除了让他们关闭窗口之外,它不需要任何交互。当我现在在我的工作表上运行这个函数时,调试器运行干净但堆栈记录器说
“你没有权限在 onEdit(TestCode:16) 调用 showModelessDialog”
我解决了这个问题并重命名了该函数,因为它可能与我必须设置的事件触发器冲突。所以这是我现在的代码:
function onConf(e){
var ss = SpreadsheetApp.getActive();
var s = ss.getActiveSheet();
var r = ss.getActiveRange();
var row = r.getRow();
var column = r.getColumn();
//moving from the Form Responses 1 sheet to the Processed sheet
if(s.getName() == "Form Responses 1" && r.getColumn() == 1 && r.getValue() == true) {
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Processed");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).copyTo(target);
s.deleteRow(row);
}
var ProOrd = HtmlService.createHtmlOutput(numColumns);
SpreadsheetApp.getUi().showModelessDialog(ProOrd, 'Details have been archived to the Processed sheet')
}
正如建议的那样,我已经捕获了这些数据(这对我来说很有意义。我看不出它如何在不捕获数据的情况下移动数据)。
但在这里我试过了:
var ProOrd = HtmlService.createHtmlOutput(target);
var ProOrd = HtmlService.createHtmlOutput(numColumns);
var ProOrd = HtmlService.createHtmlOutput(row);
使用 target 消息只会显示“未定义”。 使用 numColumns 消息显示“7”。 使用行消息显示“2”。 即使我看不出使用“s”或“r”变量是有意义的。 所以我尝试了这个:
if(s.getName() == "Form Responses 1" && r.getColumn() == 1 && r.getValue() == true) {
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Processed");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
var outPUT = s.getRange(row, 1, 1, numColumns);
s.getRange(row, 1, 1, numColumns).copyTo(target);
s.deleteRow(row);
}
var ProOrd = HtmlService.createHtmlOutput(outPUT);
SpreadsheetApp.getUi().showModelessDialog(ProOrd, 'Details have been archived to the Processed sheet')
}
但以这种方式定义outPUT 变量也会导致对话框中出现“未定义”消息。德拉特。那行信息隐藏在哪里?
我取得了更大的成功! 我现在有这个代码:
function onConf(e){
var ss = SpreadsheetApp.getActive();
var s = ss.getActiveSheet();
var r = ss.getActiveRange();
var row = r.getRow();
var column = r.getColumn();
//moving from the Form Responses 1 sheet to the Processed sheet
if(s.getName() == "Form Responses 1" && r.getColumn() == 1 && r.getValue() == true) {
var numColumns = s.getLastColumn();
var data = ss.getDataRange().getValues(); // added
var targetSheet = ss.getSheetByName("Processed");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).copyTo(target);
s.deleteRow(row);
}
var ProOrd = HtmlService.createHtmlOutput(**data**);
SpreadsheetApp.getUi().showModelessDialog(ProOrd, 'Details have been archived to the Processed sheet')
}
我一直在阅读并尝试为变量data 加粗新代码行,它在 html 代码中调用。但是好像只是前后加了两个星号,在对话框中我没看到加粗。
我现在确实在推送的对话框中获得了一组数据!
然而,它是工作表中的所有行,而不是符合true 条件的一行。在工作表中所有打开的行中包含“错误”报告。
如何限制这个数组只包含符合条件的数据? 实际上,一次应该只有一行数据。我附上了一张图片。当时表格中有 3 行信息。我单击了第三行 PROCESS NEXT,它移动了该行数据并将数组推送到对话框。您可以在演示文稿中看到第三行数据(对于我的 Pierce Arrow),并且可以在背景中注意到它已移动。它现在就在另一张纸上。
我认为将数据变量放在我所做的代码中,会在识别出真实条件后捕获数据数组。 显然不擅长这个,但我正在学习并且我很坚持。
几乎整个周末都在研究这个问题,并取得了一些进展,但还不明白。这是我目前拥有的代码:
function onConf(e){
var ss = SpreadsheetApp.getActive();
var s = ss.getActiveSheet();
var r = ss.getActiveRange();
var row = r.getRow();
var column = r.getColumn();
//moving from the Form Responses 1 sheet to the Processed sheet
if(s.getName() == "Form Responses 1" && r.getColumn() == 1 && r.getValue() == true) {
var numColumns = s.getLastColumn();
var targetSheet = ss.getSheetByName("Processed");
var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
s.getRange(row, 1, 1, numColumns).copyTo(target);
s.deleteRow(row);}
var celldata=s.getRange(row, 1, 1, numColumns).getValues();
var data=HtmlService.createHtmlOutput(celldata);
SpreadsheetApp.getUi().showModelessDialog(data, 'Details have been archived to the Processed sheet')
}
我第一次运行了这个测试,它实际上生成了半像我想要的输出。我太兴奋了!
但是所有后续测试都失败了。
仅给出正文中带有 false,,,,, 的对话框。
此外,当我尝试遍历函数时,我现在收到此错误: 找不到方法 getRange(number,number,number,(class))。 (第 14 行,文件“TestCode”)解雇
我不明白为什么相同的代码可以将数据行复制到目标,但不能定义一个变量来表示这些单元格中的值以在对话框中显示。
我知道我并没有完全偏离轨道。如果我替换此代码:
var celldata=s.getRange(row, 1, 1, numColumns).getValues();
使用此代码:
var celldata="heres some data to review";
我将消息推送到对话框。
....这么近... 我同样尝试了这段代码:
var celldata=s.getSheetValues(row, 1, 1, numColumns);
但在遍历代码时会出现类似的错误: 找不到方法 getSheetValues(number,number,number,(class))。 (第 14 行,文件“TestCode”)解雇
我对 getSheetValues 和/或 getRange.getValues 命令有什么不理解的地方?它们听起来很合乎逻辑......
【问题讨论】:
-
您已经拥有一个存储为变量
target的范围变量。包含复制的行。你想做什么? -
我添加了几行来说明要点。我想获取该“目标”数据并将其推送到对话框中。最终用户会将信息放入另一个软件并关闭此对话框。除了让他们关闭窗口之外,它不需要任何交互。当我现在在我的工作表上运行这个函数时,调试器运行干净但堆栈记录器说“你没有权限在 onEdit(TestCode:16) 调用 showModelessDialog”
-
在那里发现了问题。必须安装触发器。好激动!现在,当数据行移动时,对话框会被推送,对话框呈现并具有标题,但正文显示未定义......现在如此接近。
-
@Random 你确定如何在 Dialog 中显示正文,还是还在寻求帮助?
-
哦,我确实还在尝试。我只是觉得这一定是可能的。
标签: google-apps-script google-sheets triggers