【MACRO】Google Apps Script 質問スレ【DRIVE】
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/ >>242
htmlservice + oauth2 >>243
> >>242
> htmlservice + oauth2
ありがとうございます。
調べてみます。 htmlからツイにつぶやくのをやってたら
(>_<)この顔文字が(>_<)こんななってたぶんそのせいででエラー吐くんだけどこれはreplaceすればいいのかな?
こういう表記になる文字ってたくさんあるのかな? >>245
おいてめーそれ「はじめてのホームページビルダー」レベルじゃねぇか >>245
そういうのはエンコードすべきなんじゃないのか? >>246
PHPはちょっと良くわかんないです
gasですし
>>247
そうなんですよね〜
初心者なんです
>>248
エンコードですか
調べてみます >>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ファイル)
が実現できないと思うのですが、どうでしょう? 分かる人がいたら教えて下さい
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/ ttp://www.google.co.jp/images/srpr/logo11w.png
404
The requested URL /images/srpr/logo11w.png'; was not found on this server. 普通に繋がるんですが・・・
というか画像のURLに関しては色々試してます data: {
type: 'base64',
image: 'hogehoge(base64data)hogehoge'
}
ためしてみたけど
400
Image format not supported, or image is corrupt.
なんぞこれ >>254
OAuth2の認証系をしっかり組んでないからじゃないかね。
http://wp.me/p5KJV2-9k >>260>>261
そっちなんですね
読んできます
ありがとうございます 読んでも全然わかんないや(´・ω・`)
ツイとかはコピペでなんとかなったけどimgurはあんまり見つかんないからやっぱ自力じゃ無理なのかな 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);
}
} >>254 のは匿名うp用の認証してるからOAuth2は関係ないね Content-Type: application/json
つけたらでけた どこに付ければいいか分からないので適当に色々なところに付けてみましたが出来ませんでした
もう少し詳しくお願いします headers: {
Authorization: 'Client-ID ' + clientId,
Content-Type: 'application/json'
}, >>268
そう書くと保存の時に「プロパティ ID の後に : がありません。」ってエラーが出るんですけどなんでだろう
headers: {
Authorization: 'Client-ID ' + clientId,
Content-Type: 'application/json' ←この行
}, 'Content-Type': にしてみてもダメでした multipartで渡してエラー吐くと思ったらJSONで渡すんだねこれ… 独自関数(自作)でbackGroundの色が特定の色の場合にsumする関数をつくりたいんだけど、
引数でバックグラウンドの色ってとりだせるの?
というより、適当に作ったんだけど、スクリプト保存しないと独自関数を使用しているセルが更新されなくて困ってる。 何でもできるようになってきて
すごくありがたく使わせてもらってるんだけど
実行速度が遅いのは何とかしてほしいなぁ 遅いね
あとREMOTE_ADDRとか取れなかった気がするのも痛い スプレッドシートの0:00とか時間表記でのものを時と分に分けて数値として扱いたくて
getRangeで2次元配列で読み込んで時間の部分をsplit使って:で分けました
でもSSの時間部分の書式が日付になるとWed Nov 18 2015 00:00〜みたいなDateで読み込まれるし
書式なしテキストにするとStringになって数値として扱えないんです(8:00だったら8と00になって足すと800になる)
どうすればいいでしょうか? >>282
固定させたいカラムを晒してくれないとわからない
カラムによってはその機能が備わってるみたいだし ごめんなさい
自己解決しました
Number()ってのをつかったらいけました グローバルでconstを使うと、
「TypeError: 定数 **** の再宣言。」
とエラーが出るのですが、グローバルではconstは使えないのでしょうか? シート上のデータをまとめてカレンダーに移したいのですが
GASからbatch requestで処理できますか?
もしできるなら似たような事例でコードがわかるものを教えてください >>291
CalendarApp使えばいいじゃん >>290
すみません、説明が不足していました。
constで定義した名前は他の場所では宣言していません。
ただ、グローバルでconstを使うと、再宣言していない定数でも
「TypeError: 定数 **** の再宣言。」とエラーになってしまいます。
(function内などのスコープではconstは普通に使えています。)
constでなくvarを使うと再宣言のエラーは出ません。
また、const指定する定数の名前は何にしても再宣言のエラーが出ます。
constの使い方が間違っているのかもしれませんが、何かおかしい点があれば教えていただけないでしょうか? すごく初歩的な質問だと思うのですが原因が解りません
どなたか教えて下さい
下記サイトを参考にスクリプトを作成したのですが
http://chaika.hatenablog.com/entry/2015/09/03/143622
デバッグすると一番最初の
var ss = evt.source.getActiveSheet();
の箇所で
TypeError: undefined からプロパティ「source」を読み取れません。(行 3、ファイル「コード」)
と出てしまいます
ググったところ、スクリプトの作成元が間違っていると出たりするようですが
参考サイトではスプレッドシートから作成、とあるので間違いではないと思います
かといって何が問題なのか解りません 3. エディタのリソースをクリックして、**現在のプロジェクトのトリガー**を選択
4. 実行をonEditEvent、イベントをスプレッドシートから・編集時 にして保存 >>297
296です
その設定はやってあります
再度確認しましたがその通りになっています
ですが、デバッグすると296の通りです
https://i.gyazo.com/196e454d6eee012351e550aa5cbf3cd3.png 関数指定してデバッグボタン押しただけとか?
まさかなー >>299
296です
私へのレスでしょうか?
何かやり方が間違っているのでしたら教えていただけませんか? いや、俺もトリガーの機能をここのやり取りで知ったぐらいだけど、
デバッグボタンを押すだけだったら
onEditEvent();
と呼び出されるだけじゃない
evtがundefinedなのはそのせいかなと思って
実際どうなん?
正式なやり方はしらんけど、Loggerでトリガーが起動された時に
どんなオブジェクトが渡されてくるかを調べる
そういうオブジェクトを自力で用意してonEditEventに渡す関数を作成する
その関数をデバッグモードで起動
とかするんじゃないのかな
ググってみればやっている人いるかも とりあえず、「Hello,World」から始めようと思ってやってみたんですが、
「Cannot call Browser.msgBox() from this context;
have you tried Logger.log() instead? (line 1, file "helloworld")」
とエラーがでていきなり動きません。
エラー内容で検索してみたのですが、
同様のケースは見つからず困っています。
原因は何なのでしょう?
ソースは以下の通りです。↓
function myFunction() {
Browser.msgBox("Hello World!");
} スプレッドシートで やったら普通に動いたよ
this contextとある様にどんな状況でスクリプトを実行しているかが問題だと思う >>303
そもそも、Browser.msgBoxってスプレッドシートでしか使えませんよ。
なので、普通は例えば
var ui = SpreadsheetApp.getUi();
ui.alert(“helllo world”);
です。uiのgetUiの部分をDocumentApp.getUiにすればドキュメントでも
同じように使えます。Browser.msgBoxは現在は非推奨ですよ。 >>303
> from this context >>304 >>305 >>306
「Hello World」はスプレッドシート経由じゃないと実行できないんですね。
私はGoogleDriveからスクリプトを新規作成して実行していました。
だからエラーがでて動かなかったんですね。
ためしにスプレッドシート経由で動かしてみたところ、
無事、「Hello World」が表示されました。
教えていただいて、ありがとうございました。助かりました。 インスタのAPIで色々しようと思ったけどoauth2が全然分かんないや
gasでインスタapi扱い方書いてるサイトとかないだろうか? 現在、Google DriveをAPI経由で使うための勉強をしています。
[root]
+[個人的なフォルダ]
+[公開している共有しているフォルダ]
このような構成で、API経由で両フォルダ上にファイルの読み書きを想定しています。
ひの際に使うアクセストークンが知られてしまうと
だれでも両フォルダのの中身をいじることができるようになってしまいます。
そこで質問なのですが、「公開している共有しているフォルダ」の操作だけを
許可するトークンは発行できるのでしょうか。
ひとつユーザを作って「公開している共有しているフォルダ」を共有し
そのユーザでトークンを発行すれば期待どおりになるということはわかったのですが、
お金を削減したいので、ひとつの特権管理者ユーザだけで実現したいのです。
お詳しい方いらっしゃいましたら、どうか教えて下さい。 >>309
googleアカウントでログインさせろ >>309
アクセストークン使わずにコーディングする。ヒントhScript.getOauthTokenだったかな。
PDF作成時にも使う手ですよ。 GASのWebアプリケーションで質問です。
doGetで受けたパラメーターは
e.parameter.xxxで取得できますが
これをクライアントに渡す方法で悩んでます。
今はdoGetで受け取ったらUsetCacheに預けて
html(template)側で<? ?>を使って取り出しています。
初心者ながら、これがスマートじゃない気がして、
違和感を拭いきれないのです。
スマートな方法を教えてください。 匿名通信(Tor、i2p等)ができるファイル共有ソフトBitComet(ビットコメット)みたいな、
BitTorrentがオープンソースで開発されています
言語は何でも大丈夫だそうなので、P2P書きたい!って人居ませんか?
Covenantの作者(Lyrise)がそういう人と話したいそうなので、よろしければツイートお願いします
https://twitter.com/Lyrise_al
ちなみにオイラはCovenantの完成が待ち遠しいプログラミングできないアスペルガーw
The Covenant Project
概要
Covenantは、純粋P2Pのファイル共有ソフトです
目的
インターネットにおける権力による抑圧を排除することが最終的な目標です。 そのためにCovenantでは、中央に依存しない、高効率で検索能力の高いファイル共有の機能をユーザーに提供します
特徴
Covenant = Bittorrent + Abstract Network + DHT + (Search = WoT + PoW)
接続は抽象化されているので、I2P, Tor, TCP, Proxy, その他を利用可能です
DHTにはKademlia + コネクションプールを使用します
UPnPによってポートを解放することができますが、Port0でも利用可能です(接続数は少なくなります)
検索リクエスト、アップロード、ダウンロードなどのすべての通信はDHT的に分散され、特定のサーバーに依存しません
17 Google Apps Scriptって重くね?
かなり処理量すくないスクリプト書いたんだけどモッサリしてる。
起動が遅いだけなのかなぁ。 コード更新後最初にアクセスしたときにプロセスが立ち上がる感じで
何度かアクセスするといくつかのプロセスが立ち上がるので
最初の数回は全部遅い感じがするが
しばらくすると速くなってくる
ただしプロセスのキャッシュ有効期限が過ぎるとまた最初からなので遅くなったり 質問です。
スプレッドシート内にいくつかの図形を配置してるんですけど
セルの値が編集された時、一個の図形(地図画像)を
更新(画像削除→画像再配置)したいです。
今は画像を削除→画像作成script と手作業でしています。
この作業をscripで出来ますでしょうか? google siteってjavascript使えなくて、代わりにGAS使えってことなの? >>321
gasはあくまでサーバーサイドなので
クライアントサイドは普通にjs使えるのでは? >>321
元々サイトっていうより、Wikiなので。あのサービスは。
なので埋め込みのApps Scriptを使えって事です。
>>322
それはApps scriptのHTML Serviceの中の話です。 実行している自分自身のFile IDを取得するにはどうしたらいいでしょうか 自己解決しました、やりたかったのは同じソースでも実行するfile idによって動作を変えたかった、なんですが、
ローカルで開発してgapps pushするときにうまく切り替えるようにしました、、、 FileIDかどうかは知らんけどデプロイして変わったのを知りたいなら
AppVersionみたいなのは実行中に取れた気がする
(管理画面に表示されるやつと同じもの) 質問するスレ間違えてたみたいなのでここで改めて質問させてください
http://hesonogoma.com/stocks/japan-all-stock-prices.html
この株価データサイトのデータを定期的にスプレッドシートに表示させたくて
ここ数ヶ月悩んでます
1
サイト下部にある Copy to Clipboad からコピーしてシートに貼り付ける
というスクリプトは可能ですか?出来るならどうすればいいのでしょうか?
2
CSVファイルをダウンロード
本来はこのやり方を調べていました。が、flashで表示されているのでurlが判らず
お手上げ状態に・・
1が無理なら2を何とかしたいと思っております っつーか PritView でよくね
ただの html 取れるぞ >>331
レス有難うございます。PrintViewでどうにかできそうですか!
でもどうすればいいか解らないレベルなので
とりあえず図書館でjavascriptの本を借りてきました
「はじめに」
読んでるうちに寝てもうたw ちなみに>329の2を試してみたときのコードが
function getCsvSample() {
var folderId = '***********';
var destfolder = DriveApp.getFolderById(folderId);
var date = "2016-08-04";
var response = UrlFetchApp.fetch("http://hesonogoma.com/stocks/media/swf/copy_csv_xls_pdf.swf");
destfolder.createFile(date + '.csv', response.getContentText('Shift_JIS'));
}
です。拾ってきたコードをいじって実行したら
謎の文字化け集団が襲ってきました (ここで心折れる) GASでスクレイピングしたいんですが、UrlFetchAppで取得したHTML(XMLじゃない)をDOM化するのってできますでしょうか?
正規表現で必要なところを取ってくるのは心が折れそうなので、セレクタで処理したいです。 >>329-333
Shift_JIS ではなく、UTF-8 で保存すれば?
その後、TeraPad などのエディタで、Shift_JIS に変換する >>336
レスありがとうございます
試してみたんですが、うまく変換できませんでした
やっぱりurlが違うのかな、、
このスレの質問、回答がほとんど理解できてない程度ので
もう少し基本からじっくり勉強してみます!
>>329の1だけ
引き続き質問を残させてください GASでgoogleAPIを叩いてgmailの下書きを作成するものを作ったのですが、
これを毎日作成(雛形をコピー)するスプレッドシードで使いたいと思っています。
スプレッドシートに書いてコピーすると、gAPIの紐付けプロジェクトが変わっているので設定しなおさなければ使えず、困っています。
スプレッドシートをコピーして、シート上のボタンを押したらすぐに下書きを作れる状態を作りたいのですが、どのような方法がありますか? >>340
GASのGmailAppでダメ?
ttp://qiita.com/minanami/items/87641f09192be1b5010b
個人的にはフォームから入力させた方がGUI的にいいと思うけど
スプレッドシートに保存したいならその後GASで自動追加させとけばいいし