作者Oswyn (Oswyn)
标题Re: [询问] google试算表 指令编辑 置底贴上方法
时间Fri Jan 25 15:22:52 2019
※ 引述《good8195 (Kevin)》之铭言:
: 小弟对於excel熟悉
: 网路也能找到相关vba去研究
: 但是google试算表关键字少又不知道该如何搜寻
: 目前小弟有想要做一个东西是
: 复制a1跟b1後直接在c跟d栏置底贴上
: (置底是在最後一个填写的内容下一格贴上)
: 使用录制第一次可成功第二次会覆盖
: 所以想了解试算表该怎麽做
: 我excel有自己摸索过经验
: 应该看了会懂
: 或者能提供可以学习的中文网站
Google 相关网站内中文翻译页面都有一站没一站的了(好吧、是几乎没有),应该没
什麽比较完整的中文资讯,有的话我也想知道www
Google Apps Script 主要的语法、结构是基於 JavaScript 发展,但又跟 JavaScript
不完全相容。没跟上最新的 JavaScript 版本外,有些 JavaSctip 基本语法或 Object
/ Methods 也因为 Google 自身的限制因安全或效能等理由被拿掉了。
总之需要用到 Google Apps Script 的话还是可以从 JavaScript 下手,中文资讯很多
也不难找到资源。碰到不相容的时候,就碰到时再说、、、再去处理、解决。
除 JavaScript 语法外,最主要的重点还是 Google 针对 Google Apps 产品提供的物
件、类与方法等。这就只能上 Google Apps Script 网站的 REFERENCE 页面找查了。
https://developers.google.com/apps-script/reference/
由於原PO的需求很简单,只需剪贴一下就好。所以打开 Spreadsheet 的试算表中
[工具]内的[指令码编辑器]。
把下面附的程式码复制贴到[程式码.gs]中然後[储存],点[执行]内[执行函式]
选取[onOpen]函式。途中有跳出授权要求的都要许可。
回到试算表页面,[说明]的後面应该多了一个[Custom Menu]可按,点选其中的
[Copy A1 B1 & Paste]就会呼叫[myFunction]执行复制贴上的动作。
对於 Apps Script 要注意的是,资料都是处於 Google Apps 也就是伺服器的云端,浏
览器画面中的都只是结果。为了效能减少伺服器端的 I/O 的次数是极重要的。这与资
料及处理基本上都是在本机的 VBA 大不同。
在 Spreadsheet 减少对栏位资料的读取与写入,尤其是写入的次数很重要。写入资料时
比起读取 Google server 端间需要验证(耗时)。所以分别写入10个栏位,还不如一
次写入10*10的范围。
以范围读取所需的栏位值,处理完後再以范围回写。
Sheet.getRange(row, column) // 单栏位
Sheet.getRange(row, column, numRows) // 复数列(rows)
Sheet.getRange(row, column, numRows, numColumns) // 四边形范围
Sheet.getRange(a1Notation) // 以字串的方式使用 A1 或 R1C1 参照
Sheet.getRange() 吃四种参数形态设定作动范围,但後面接的方法就需要依前面范围
中的单、复数形态来选择。用错了就会报错(废言
.getValue() // 读取单一栏位值
.getValues() // 读取复数范围的值
.setValue(value) // 写入单一栏位
.setValues(array) // 范围写入
举例来说最下面例子中读取 A1 & B1 的部份
sheet.getRange(
1,
1,
1,
2).getValues()
起始点为
row 1、
column 1,取
1 row、
2 columns
可替换成以 array 包装填入,getRange()中设定的范围大小必需等於填入的资料大小
// 读取 row 1, collumn 1 的 A1 栏位值
var a1 = sheet.getRanges(1, 1).getValue();
// 读取 B1 栏位的值
var b1 = sheet.getRange('B1').getValue();
// 将 a1, b1 包装成 Array object 直接送出
sheet.getRange(i + 1, 3, 1, 2).setValues([[a1, b1]]);
上面就是简单的操作 Google Spreadsheet 栏位资料(读/写)的基础方法。其它较进
阶的处理就上 查 Apps Script reference 了吧。
※
function myFunction() {
var sheet =
SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var maxRows = sheet.getMaxRows();
var range =
sheet.getRange(1 , 3 , maxRows , 2).getValues();
for (var i = 0; i < maxRows; i++) {
// 阵列从零开始计
if (range[i][0] === '' && range[i][1] === '') {
// 列(row)、栏(column)从一开始计
sheet.getRange(i + 1, 3, 1, 2).setValues(
sheet.getRange(1, 1, 1, 2).getValues());
break;
}
}
}
function onOpen(e) {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Custom Menu')
.addItem('Copy A1 B1 & Paste', 'myFunction')
.addToUi();
}
--
人间五十年、化天のうちを比ぶれば、梦幻の如くなり
^,,,^ 一度生を享け、灭せぬもののあるべきか
(ミ‵ω′)\m/ NOBUMETAL
DEATH!!(乂
'ω')
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 61.230.194.76
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Google/M.1548400976.A.37F.html
1F:推 jikker: 推 认真好文 01/31 10:20