X



【MACRO】Google Apps Script 質問スレ【DRIVE】
0001デフォルトの名無しさん
垢版 |
2014/06/29(日) 11:07:03.38ID:5HmND7Qc
Google Apps Script でのプログラミング等に関する質問スレです
Excel や Access の VBA に不満のあるあなた
web アプリだけでなくクライアントアプリからも利用したいあなた
ローカルなデータベースやファイルだとバックアップに不安のあるあなた

ム板に無かったので立ててみます

Google Apps Script
ttps://developers.google.com/apps-script/
Google Drive API
ttps://developers.google.com/drive/
Getting Started with the Google Data Python Library
ttps://developers.google.com/gdata/articles/python_client_lib

■関連スレ
Google Maps API 質問箱
http://peace.2ch.net/test/read.cgi/tech/1131627583/
Microsoft SkyDrive API
http://peace.2ch.net/test/read.cgi/tech/1385604796/
【GoogleAppsScript】猿92【研究せよ!!!】
http://nozomi.2ch.net/test/read.cgi/php/1398600864/
GoogleAPIってどうよ?
http://nozomi.2ch.net/test/read.cgi/php/1018614427/
Google App Engine for Python 6アプ目
http://nozomi.2ch.net/test/read.cgi/php/1358570953/
Google App Engine for java
http://peace.2ch.net/test/read.cgi/tech/1317639323/
GoogleWebToolkit[GWT]について語ろう
http://nozomi.2ch.net/test/read.cgi/php/1147975874/
0191デフォルトの名無しさん
垢版 |
2015/04/06(月) 19:06:09.55ID:Uo28IzYD
script.googleにてディレクトリに存在するファイル全て開いて検索するプロジェクトのgsファイルを作ってるんですが
コード.gsて一度に開けるファイルの数や容量の制限ありますか?
0192デフォルトの名無しさん
垢版 |
2015/04/07(火) 11:43:06.04ID:Dj35uwLZ
ちょっとした質問なんですけどDriveApp.getRootFolder()みたいに共有アイテムにある「textフォルダ」を取得する方法ってないですか?
0194デフォルトの名無しさん
垢版 |
2015/04/11(土) 21:16:39.83ID:yuSJQZvz
1.gmailの受信メールをチェック

2.特定タイトルのメールの送信者を抽出しリストアップ

3.別のリストとマッチングさせメール未送信者を特定

4.未送信者に注意メールを送信

GAS初心者なのですが
上記のようなシステムを構築したいと考えています。
1.2.4はGASとスプレッドシートを使えば簡単に実装できそうなのですが
3もGASやappsのみで構築可能でしょうか?
スプレッドシートのマッチングについて
少し調べて見ましたが、明確な回答は見つかりませんでした。
よろしくお願いします。
0195デフォルトの名無しさん
垢版 |
2015/04/13(月) 07:45:32.11ID:eHLkbahF
>>194
可能

普通にリニアサーチでメアドリストと1つづつイコールかどうか
確認するループを作ればいいだけ
0197デフォルトの名無しさん
垢版 |
2015/05/20(水) 20:15:39.64ID:L+8WGw0p
最近始めたんだけどこれmydriveにアップしたExcelを読み込む事は出来ないのかな
getDataAsString()でも文字化けしたのしか取得できないし
スプレッドシートに変換すりゃいいんだろうけどそのまま読み込む方法ないのかね
0200デフォルトの名無しさん
垢版 |
2015/05/21(木) 09:50:23.52ID:x9iUxaW9
エクセルはどこでも話題になるけどDriveApp.searchFiles()で一応文章検索はできるから
セルのstring情報はどっかに記録されてる
ただ引き出して扱えるかどうか知らん
0201デフォルトの名無しさん
垢版 |
2015/05/21(木) 10:56:25.53ID:ESp1pCeJ
馬鹿には無理
0205デフォルトの名無しさん
垢版 |
2015/05/27(水) 08:07:09.69ID:lvaBWQ33
>>204
君はGoogleのドキュメントがろくにメンテされてないこと知ってんの?
それと、GASで使うのにOAuthなんて使わないよw

JavaScriptで使う場合には必要だがそっちだって、OAuth2.0でのコーディングに
関しては別のページにあるし。GASやGoogle APIを弄っている人間とは到底思え
ない発言だなw
0206デフォルトの名無しさん
垢版 |
2015/05/27(水) 11:08:24.77ID:fMt5EoRl
> それと、GASで使うのにOAuthなんて使わないよw
ひょ、標準APIとの違いも解らない奴がココに居るのか
ちょっとキミにはこのスレちょっと早い
0208デフォルトの名無しさん
垢版 |
2015/05/27(水) 15:16:08.57ID:jmeRjzK/
知らないから自演も満足に出来ないんだろうが
煽り方が下手だと思う
0209デフォルトの名無しさん
垢版 |
2015/05/27(水) 16:25:43.57ID:smOTLbR3
>>206-207
だから、使ってからほざけよ。

コード書いてみ?GAS内でDrive API使うコードをな。
実際に開発やってる奴に、釈迦に説法って言葉覚えておけよ三流。
0210デフォルトの名無しさん
垢版 |
2015/05/27(水) 16:29:32.25ID:smOTLbR3
>>204
それとお前。
OAuth1.0だから何?そんなもの自分で2.0の実装でも換装すりゃいいだけの
話だろww

馬鹿なの?それとも2.0のコードでも書けとか言ってるわけ?馬鹿には無理だ
から引っ込んでろ
0211デフォルトの名無しさん
垢版 |
2015/05/27(水) 20:42:22.92ID:iPQChm+t
なんか急にonEditのe.userにメールアドレスが入ってこなくなったんだが
同じ現象の人いる?
0212デフォルトの名無しさん
垢版 |
2015/05/28(木) 09:53:52.42ID:/8nOg4qQ
これで良くね
ttp://stackoverflow.com/questions/26702330/why-does-google-apps-script-return-a-url-rather-than-a-pdf-file-when-i-try-to-cr
0213デフォルトの名無しさん
垢版 |
2015/06/08(月) 08:54:21.97ID:0Vy1Z1yY
>>211
そんなのしょっちゅうあるぜ?
session.userなんてメアド取れなくなったりとかね。
Googleって馬鹿だからバグ採りもせずにデプロイしてやがるのでこういうことがGoogle Apps for Workでも起きていてもんだいになってる。
0214デフォルトの名無しさん
垢版 |
2015/06/08(月) 13:38:40.43ID:rJB8iCDI
Googleって独りよがりだよな
0215デフォルトの名無しさん
垢版 |
2015/06/11(木) 09:07:55.30ID:DJZgiAWM
書式設定を変えるようなスクリプトを作っても反映されないんだけど、
スプレッドシートの既知の問題?
例えば下のスクリプトを実行すると、既に長い文字列が入ってるセルがあっても
折り返してくれない。
(スクリプト実行後、ボタンはちゃんと「テキストの折り返し」になってるし、ボタン押せば折り返す)

function test() {
var sheet = SpreadsheetApp.getActiveSheet();
var range = sheet.getRange('A:A');
range.setWrap(true);
}

この問題って、フォームから文字列が入力されても既に書式設定してあるセルで
同じ事が起きるんだけど、地味に困ってる。
0216デフォルトの名無しさん
垢版 |
2015/06/12(金) 10:07:42.64ID:7lwiQU6T
TwitterBotを作成しているのですが
OAuth1 for Apps Script
https://github.com/googlesamples/apps-script-oauth1/blob/master/samples/Twitter.gs
にCONSUMER_KEYとCONSUMER_SECRETを入れてrunを実行しても投稿されません。
ログには Open the following URL and re-run the script
表示されるアドレスにアクセスするとSuccess!と表示されますが投稿されません。
どうしたら投稿できるようにできますか?
0217216
垢版 |
2015/06/12(金) 10:12:38.54ID:7lwiQU6T
>>216
動きました。すみません。
0219デフォルトの名無しさん
垢版 |
2015/06/12(金) 17:28:28.59ID:7lwiQU6T
atomのlinkのhrefを取得したいのですがどうすればいいのでしょうか

function kochiRSS() {

var sheet = SpreadsheetApp.getActiveSheet();

var row = 1;

var feedURL = 'http://www.pref.kochi.lg.jp/news/index.atom';

var xml = UrlFetchApp.fetch(feedURL).getContentText();
var document = XmlService.parse(xml);
var root = document.getRootElement();
var atom = XmlService.getNamespace('http://www.w3.org/2005/Atom');

var entries = root.getChildren('entry', atom);

for(i in entries) {
var title = entries[i].getChild('title', atom).getText();
var link = entries[i].getChild('link', atom).getValue();
var updated = entries[i].getChild('updated', atom).getText();

sheet.getRange(row,1).setValue(title);
sheet.getRange(row,2).setValue(link);
sheet.getRange(row,3).setValue(updated);

row++;
}
sheet.sort(3, false);
}
0220デフォルトの名無しさん
垢版 |
2015/06/12(金) 18:11:48.05ID:qp6MkQCv
.getAttribute('href').getValue();
0221219
垢版 |
2015/06/12(金) 20:37:23.23ID:RT2PlkdQ
220
できましたどうもありがとうございます。
0222デフォルトの名無しさん
垢版 |
2015/06/13(土) 03:16:47.88ID:NUKk6CPY
どういたしまして
0223219
垢版 |
2015/06/13(土) 08:02:49.41ID:YFXshuK4
たびたびすみません。
RSSを取得するプログラムを作っているのですが

RSS2.0は
var items = root.getChild('channel').getChildren('item');
ATOMは
var entries = root.getChildren('entry', atom);
で取得できるのですが
RSS1.0だとitemが<item rdf:about="記事のURL">なため
var items = root.getChildren('item');
では取得できません。
どういう書き方にすれば取得できるようになるのでしょうか?
0224デフォルトの名無しさん
垢版 |
2015/06/13(土) 08:38:19.04ID:NUKk6CPY
馬鹿には無理
0226デフォルトの名無しさん
垢版 |
2015/06/14(日) 06:25:18.68ID:Gz1SNEoH
馬鹿には(回答は)無理
0229デフォルトの名無しさん
垢版 |
2015/06/15(月) 20:34:44.01ID:TKCLtNo1
正直、DOM系の話題はなしにしたいものだ
DOMの話題ってjsの使い方一辺倒になっちまうから
GASそのものの本質を追究する姿勢が培われなくなってしまう
0230デフォルトの名無しさん
垢版 |
2015/06/15(月) 20:57:28.70ID:vJyBnBQX
GASはハウツー的な日本語ドキュメントが少ないから仕方ないかと
誰かその辺りをまとめてくれると(俺も)助かるんだがなー…(チラッチラッ
0232223
垢版 |
2015/06/17(水) 05:49:31.92ID:pjaGN1aW
ありがとうございます。
rdf:aboutのようなのは名前空間というみたいで
XmlService.getNamespaceを指定すると使えるようです。
詳しくはこちらに載っていました。
https://msdn.microsoft.com/ja-jp/library/aa468565.aspx
0233デフォルトの名無しさん
垢版 |
2015/06/17(水) 14:14:39.78ID:T4rbUCsj
いやここはGASのスレだしw
XMLの基本を鼻高々に解説されても
0235デフォルトの名無しさん
垢版 |
2015/06/30(火) 15:54:55.56ID:jfSOFpG/
google apps script のウェブアプリケーションの公開するとき
指定したグーグルアカウントだけに利用させるって出来ないんですかい?
共有でそういうのあったんですけど、共有はコード見れるとかそういうのだったんで
0236デフォルトの名無しさん
垢版 |
2015/06/30(火) 17:35:30.60ID:0T0Q+C6j
スレ違いだけどできないはずはないと思うよ
appsにアカウント登録できるはず
0237デフォルトの名無しさん
垢版 |
2015/07/01(水) 07:45:04.29ID:WrSpGcQO
>>235
1) googleアカウントでログインしてるユーザーだけに実行させることが出来る
2) アプリケーション側でどのアカウントで実行されているか把握することが出来る

1) と 2) を組み合わせれば可能
0238235
垢版 |
2015/07/01(水) 15:27:56.64ID:s1huTgGg
出来たよありがとう
"無ければ作れ"がGASでも通用したとか最高だ
0240デフォルトの名無しさん
垢版 |
2015/07/04(土) 14:34:59.39ID:PdgAmMn6
GASに初トライしていて問題にブチあたりました。
解決方法があれば教えてください。


■やりたいこと
スプレッドシート内で
外部ページ情報を取得しリアルタイム・もしくはインターバル更新表示しい。
基本は自動更新

■更新条件
スプレッドシートを開いた
スプレッドシートのセルにユーザーから入力があった。
の両方です。

■ためしたこと。
1.=ImportXMLを使って取り込み
 単純な目的は果たせるがセルに埋め込むと取得データを加工するにしても限度がある。
また、同じURLを指定したセルが複数ある場合、同じデータなのにアクセスさせるのが無駄
2.GASでImportXML相当のことをしてみる
 セルから呼び出せる関数でUrlFetchApp.fetchを使ってみる。
 当初の目的は果たせるようになったが、セルの数が多く、
 またスクリプト実行テストを繰り返しているとあっというまに1日の呼び出し回数制限に達してしまう(無料アカなので2万回)
3.呼び出し制限に達しないようにするための工夫
 URLから取得した情報をプールしておき、前回取得からのインターバル時間を経過したら再取得してキャッシュ更新。
 または、キャッシュに存在しないデータを要求された場合もキャッシュ更新。
 キャッシュ場所は、自分のスプレッドシート内にcacheシートを生成してそこに書き込んでおく。
4.3までのロジック実装は完了し、スクリプトエディタの関数実行テストまでは正常完了

続きます。
0241デフォルトの名無しさん
垢版 |
2015/07/04(土) 14:44:48.33ID:PdgAmMn6
4からが問題でして、エディタ内の関数単体テストでは、データ取得・キャッシュシート生成まで問題なく動作しました。
 しかし、これの関数をセルから呼び出そうとするとエラーになります。

エラーはシートに対して操作権限がないといわれます。
調べたところセルで関数を呼び出した場合、
var ss = SpreadsheetApp.getActiveSpreadsheet();
var cacheSheet = ss.getSheetByName( g_stocksSheetName );
で取得したシートに対して、作成・修正・削除などの操作が出来ないようです。
つまりセルから呼び出した場合オブジェクトの参照関数しか呼び出しが許可されない?
ss.insertSheet( 'cacheSheet' )
とか
cacheSheet.getRange( 1, 1 ).setValue( new Date() );
もダメでした。

5.イベントハンドラを使ってみる
しょうがないので、書き込み権限を与えてくれそうな仕組みがないかテストしていたところ
onEvent,onOpenなどならいけそうだったので、
onEventから呼び出してみました。
すると、シート作成・データセットまではうまくいきますが、
UrlFetchApp.fetchでエラーになっているらしく、
上流で捉えた例外は
fetch を呼び出す権限がありません
でした。
0242デフォルトの名無しさん
垢版 |
2015/07/04(土) 14:54:35.26ID:PdgAmMn6
6.キャッシュの保存場所
自分に書き込めない場合、どっかに保存できないの?と思い調べてみると
ScriptDb とか言うのがあるみたいですが、サービス終了予定の機能ぽいですし、
Google Cloud SQLとかいうのを使うしかない?有料??

■知りたい事
・1〜6の流れで問題となっているアクセス権を解決できる方法はありますか?
・無理な場合の代替え手法はありますか?
・そもそもアプローチが間違っている、こうしたほうが良いよ。
という感じでうs。

このまま、いろいろ渡り歩いていても遠回りになりそうな予感なので質問してみました。
よろしくお願いします。
0244240
垢版 |
2015/07/06(月) 03:19:41.60ID:c4e3DSSP
>>243
> >>242
> htmlservice + oauth2
ありがとうございます。
調べてみます。
0245デフォルトの名無しさん
垢版 |
2015/07/07(火) 01:32:45.09ID:OGGfcKdI
htmlからツイにつぶやくのをやってたら
(>_<)この顔文字が(&gt;_&lt;)こんななってたぶんそのせいででエラー吐くんだけどこれはreplaceすればいいのかな?
こういう表記になる文字ってたくさんあるのかな?
0250240
垢版 |
2015/07/12(日) 18:50:40.39ID:yhZDzWcx
>>243
> >>242
> htmlservice + oauth2
あれから調べてみましたが、これらを使ってどうアプローチしていいか分かりませんでした。
どういうアプローチを取って良いのか、もう少し詳しく教えていただけないでしょうか?

自分が上でやっていてダメだったアプローチは以下のAuthorization modesをみると納得なのですが
https://developers.google.com/apps-script/add-ons/lifecycle

これらの状況の中でどうやって目的を達成していいか分かりませんでした。
Htmlservice, oauth2ということだったので、
外部サイト情報から取得したキャッシュをHtmlにしてGoogleDrive側に保存すればいいのかな?
とか思っていたのですが、
AuthMode.LIMITEDやAuthMode.CUSTOM_FUNCTIONでは他のサービスへのアクセスは
Any services that don’t access user data
とのことで、キャッシュを書き込めないようです。
実際に試してみましたが、スクリプト単体テストではOKでしたが、イベントハンドラから呼び出すとDrive周りの関数で権限がないといわれました。

oauth2に関してはいまいちよく分かりませんでした。
他社サービスIDなどで別サイトのサービスにアクセスする場合などの認証などに使ったりするようですが、
Googleのアカウントで自身にログインして何かをしろという事でしょうか?

どちらにしろ、AuthMode.FULLで行えるような権限を得られないと、
・キャッシュを作るための外部サイトアクセスとコンテンツ取得
・取得したコンテンツから生成したキャッシュデータの保存(シートorファイル)
が実現できないと思うのですが、どうでしょう?
0251デフォルトの名無しさん
垢版 |
2015/07/12(日) 19:09:03.00ID:slCoB0p4
設定間違えてるに+1
0252デフォルトの名無しさん
垢版 |
2015/07/13(月) 17:53:46.10ID:UxTEJ+9t
node.js / io.js 動けばいいのにね
0254デフォルトの名無しさん
垢版 |
2015/07/19(日) 04:21:49.78ID:eNaDFGYO
分かる人がいたら教えて下さい

function upload() {
var clientId = '*************';
var imgUrl = 'http://www.google.co.jp/images/srpr/logo11w.png';
var service = getService(); //aouth2のなんか
if (service.hasAccess()) {
var url = 'https://api.imgur.com/3/image';
var response = UrlFetchApp.fetch(url, { //ここでエラーが出る
method: 'post',
headers: {
Authorization: 'Client-ID ' + clientId,
},
data: {
image: imgUrl,
type: 'URL'
}
});
var result = JSON.parse(response.getContentText());
return result;
} else {

こういうエラーが出ます
{"data":{"error":"No image data was sent to the upload api","request":"\/3\/image","method":"POST"},"success":false,"status":400}
どこが間違えてるんでしょうか

imgur apiのページ
https://api.imgur.com/
0255デフォルトの名無しさん
垢版 |
2015/07/19(日) 05:55:09.18ID:EU0ROg42
ttp://www.google.co.jp/images/srpr/logo11w.png
404
The requested URL /images/srpr/logo11w.png'; was not found on this server.
0257デフォルトの名無しさん
垢版 |
2015/07/19(日) 07:23:46.52ID:EU0ROg42
さっきはエラってたが
0259デフォルトの名無しさん
垢版 |
2015/07/19(日) 14:52:50.12ID:Npxm1YBj
data: {
type: 'base64',
image: 'hogehoge(base64data)hogehoge'
}

ためしてみたけど

400
Image format not supported, or image is corrupt.

なんぞこれ
0260デフォルトの名無しさん
垢版 |
2015/07/19(日) 16:20:37.89ID:MA6NEEKT
>>254
OAuth2の認証系をしっかり組んでないからじゃないかね。
http://wp.me/p5KJV2-9k
0263デフォルトの名無しさん
垢版 |
2015/07/20(月) 01:12:32.08ID:M+3F+JJV
読んでも全然わかんないや(´・ω・`)
ツイとかはコピペでなんとかなったけどimgurはあんまり見つかんないからやっぱ自力じゃ無理なのかな
0264デフォルトの名無しさん
垢版 |
2015/07/20(月) 01:28:27.60ID:M+3F+JJV
getの方は出来たんだけどなぁ
もうちょっと読んでみよ英語分かんないけど

function getImage(id) {
var service = getService();
if (service.hasAccess()) {
var url = 'https://api.imgur.com/3/image/' + id;
var response = UrlFetchApp.fetch(url, {
method: 'get',
headers: {
Authorization: 'Bearer ' + service.getAccessToken()
}
});
var result = JSON.parse(response.getContentText());
return result;
// Logger.log(result);
} else {
var authorizationUrl = service.getAuthorizationUrl();
Logger.log('Open the following URL and re-run the script: %s',
authorizationUrl);
}
}
0267デフォルトの名無しさん
垢版 |
2015/07/20(月) 23:29:34.40ID:M+3F+JJV
どこに付ければいいか分からないので適当に色々なところに付けてみましたが出来ませんでした
もう少し詳しくお願いします
0268デフォルトの名無しさん
垢版 |
2015/07/21(火) 20:08:20.82ID:S4WMmXN0
headers: {
Authorization: 'Client-ID ' + clientId,
Content-Type: 'application/json'
},
0269デフォルトの名無しさん
垢版 |
2015/07/21(火) 22:14:27.88ID:cjPlPdED
>>268
そう書くと保存の時に「プロパティ ID の後に : がありません。」ってエラーが出るんですけどなんでだろう
headers: {
Authorization: 'Client-ID ' + clientId,
Content-Type: 'application/json'    ←この行
},
0273デフォルトの名無しさん
垢版 |
2015/07/24(金) 15:37:18.28ID:YFrH4Ww5
やさしくやさしくやさしくね
0275デフォルトの名無しさん
垢版 |
2015/08/20(木) 11:36:44.28ID:pV6cw7bo
詰んってる
0277デフォルトの名無しさん
垢版 |
2015/10/15(木) 18:03:33.74ID:bdlPZJI1
py
0279デフォルトの名無しさん
垢版 |
2015/10/28(水) 22:28:05.44ID:58PwIK9B
独自関数(自作)でbackGroundの色が特定の色の場合にsumする関数をつくりたいんだけど、
引数でバックグラウンドの色ってとりだせるの?

というより、適当に作ったんだけど、スクリプト保存しないと独自関数を使用しているセルが更新されなくて困ってる。
0280デフォルトの名無しさん
垢版 |
2015/11/05(木) 20:42:24.52ID:6t/dd9qY
何でもできるようになってきて
すごくありがたく使わせてもらってるんだけど
実行速度が遅いのは何とかしてほしいなぁ
0281デフォルトの名無しさん
垢版 |
2015/11/06(金) 18:30:44.33ID:F7EIvq3A
遅いね
あとREMOTE_ADDRとか取れなかった気がするのも痛い
0282デフォルトの名無しさん
垢版 |
2015/11/18(水) 03:36:46.11ID:CE5+T1br
スプレッドシートの0:00とか時間表記でのものを時と分に分けて数値として扱いたくて
getRangeで2次元配列で読み込んで時間の部分をsplit使って:で分けました
でもSSの時間部分の書式が日付になるとWed Nov 18 2015 00:00〜みたいなDateで読み込まれるし
書式なしテキストにするとStringになって数値として扱えないんです(8:00だったら8と00になって足すと800になる)
どうすればいいでしょうか?
0284デフォルトの名無しさん
垢版 |
2015/11/18(水) 07:26:46.79ID:nLopjri3
>>282
固定させたいカラムを晒してくれないとわからない
カラムによってはその機能が備わってるみたいだし
0287デフォルトの名無しさん
垢版 |
2015/11/27(金) 15:20:14.09ID:c/N8jVfb
火事お見舞い申し上げます。
0288デフォルトの名無しさん
垢版 |
2015/12/03(木) 15:49:15.48ID:5y9yFaIO
test
0289デフォルトの名無しさん
垢版 |
2015/12/16(水) 14:14:14.45ID:kHfROXFw
グローバルでconstを使うと、
「TypeError: 定数 **** の再宣言。」
とエラーが出るのですが、グローバルではconstは使えないのでしょうか?
レスを投稿する


ニューススポーツなんでも実況